ActionResult返回后会发生什么?

时间:2016-09-23 23:54:31

标签: c# asp.net-mvc

使用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
    }

1 个答案:

答案 0 :(得分:1)

这是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,该库可以提供better results。对于Sample,添加名称空间:

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或二进制文件。