ActionResult返回后会发生什么

本文关键字:什么 返回 ActionResult | 更新日期: 2023-09-27 18:08:29

使用MVC 5我返回Json。到达数据返回点的总时间为40毫秒。

然而,浏览器需要6000 millisconds才能获取数据,甚至在服务器上运行它。

我的问题是我返回值后会发生什么。我想找出是什么原因造成的。

    public JsonResult Read(....)
    {
        var all = _userManager.GetStuff();
        var watch = Stopwatch.StartNew();
        var r= Json(all .....);
        Trace.WriteLine("READ" + watch.ElapsedMilliseconds);
        watch.Stop();
        return r;  //Takes 40 milliseconds to get here
    }

ActionResult返回后会发生什么

这是JsonResult类型的内部代码。

public override void ExecuteResult(ControllerContext context)
{
  if (context == null)
    throw new ArgumentNullException("context");
  if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
    throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
  HttpResponseBase response = context.HttpContext.Response;
  response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;
  if (this.ContentEncoding != null)
    response.ContentEncoding = this.ContentEncoding;
  if (this.Data == null)
    return;
  JavaScriptSerializer scriptSerializer = new JavaScriptSerializer();
  if (this.MaxJsonLength.HasValue)
    scriptSerializer.MaxJsonLength = this.MaxJsonLength.Value;
  if (this.RecursionLimit.HasValue)
    scriptSerializer.RecursionLimit = this.RecursionLimit.Value;
  response.Write(scriptSerializer.Serialize(this.Data));
}

从内部代码的角度来看,JavaScriptSerializer是用于序列化传递给JsonResult的对象的类型。您可以检查这是否是您的代码执行缓慢的步骤。

试着让你的控制器像这样:

public JsonResult Read(....)
{
    var all = _userManager.GetStuff();
    var watch = Stopwatch.StartNew();
    var scriptSerializer = new JavaScriptSerializer();
    var json = scriptSerializer.Serialize(all);
    Trace.WriteLine("READ" + watch.ElapsedMilliseconds);
    watch.Stop();
    return json;  //Takes 40 milliseconds to get here
}

如果问题仍然存在,您可以实现另一种选择,您可以使用JSON.Net库实现自己的JsonResult,它可以提供更好的结果。对于示例,添加命名空间:

using Newtonsoft.Json; 

控制器:

public JsonResult Read(....)
{
    var all = _userManager.GetStuff();
    var watch = Stopwatch.StartNew();
    var json = JsonConvert.SerializeObject(all);
    Trace.WriteLine("READ" + watch.ElapsedMilliseconds);
    watch.Stop();
    return Content(json, "application/json");  //Takes 40 milliseconds to get here
}

最后,您可以比较性能。另一种可能的方法是使用另一种可以加速序列化的格式,如xml或二进制。