我有一个从javascript文件到MVC5控制器的简单Ajax调用。此呼叫大约需要2秒钟。javascript和控制器中的任务都非常简单。我无法显示完整的代码,但我对整个调用堆栈进行了性能度量。
如果所有操作在10毫秒内完成,那么这个延迟是从哪里来的?您可以在下面的图像中看到,TTFB为2.12s,我的控制器在2.12s(根据我的性能测试,2ms)之前完成此操作。
我是否错过了类似网络问题的任何事情——怀疑这一切都是在我的dev pc上完成的。我还尝试过将完全编译的应用程序部署到独立的IIS服务器(UAT,但仍然是…)上,结果是相同的。
我唯一想到的是ASP.NET在Controller方法完成之后和实际将JSON数据返回浏览器之前做些什么?
javascript执行:
1: 1.2000 milliseconds (get values)
2: 2.4000 milliseconds (validation)
3: 2.9000 milliseconds (just before Ajax call)
4: 2172.3 milliseconds (inside Ajax Success)
5: 2174.3 milliseconds (last step in Ajax Success)
6: 0, 0, 1 (see below, these are controller values)
控制器执行:
1: 0 milliseconds (Controller init, constructor completed)
2: 0 milliseconds (Action start)
3: 1 milliseconds (Action end (just before return)
javascript代码:
// previous steps omitted, you can see the times for steps 1-3.
$.ajax({
type: "POST",
url: $("#appPath").val() + "/MyController/TrivialAction",
data: req,
cache: false,
global: false,
success: function (response) {
console.log("4: " + (performance.now() - t0) + " milliseconds.")
// some code here...
console.log("5: " + (performance.now() - t0) + " milliseconds.")
console.log(response.StepsInCtrlr);
},
error: function (errorxhr, status, error) {
BootBoxDiplayHtml(errorxhr.responseText);
}
});
这是控制器返回方法(根据Peter B的回答)
return Json(new
{
IsError = resp.IsError,
ErrorMessage = string.Join("<br>", resp.ErrorMessages),
Amount = resp.Amount.ToString("n2")
}, JsonRequestBehavior.AllowGet);
(不是上面的确切要求,而是类似的要求)