使用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
}
答案 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或二进制文件。