Joh*_*udi 6 ajax asp.net-mvc performance asp.net-mvc-3 mvc-mini-profiler
我有一个ASP.NET MVC3项目,主要的aspx页面使用jQuery ajax为其部件进行动态加载.所以基本上当网站加载时,它命中/ Home/Index然后在Index(aspx)视图中,有几行jQuery进行ajax调用(到/ Home/PartOne和/ Home/PartTwo来填充页面的部分内容).
因此,每次加载页面时,它基本上都会执行3个请求:获取索引,获取PartOne,然后获取PartTwo.
问题:为什么第三个请求执行会有某种"等待"时间?我认为这是浏览器并发请求限制,但为什么不在第一个请求完成后执行?
当我通过实验性地将"OutputCache"属性放在"PartTwo"上时,它表现得如预期的那样,它正在快速执行.这暗示问题不在IIS中,而是在此之后以及在它触及我的action方法之前的某个地方.
以下是Chrome网络探查器的屏幕截图:

这是MvcMiniProfiler上的屏幕截图 - 查看第3行/值,它在执行我的控制器动作代码之前等待500ms.

我的控制器代码看起来像这样.虽然我剪断了实际的代码,但PartTwo的代码非常简单(没有长时间的计算,没有数据库调用等):
public class HomeController : Controller {
public ActionResult Index() {
// do something here
return View();
}
public ActionResult PartOne() {
// do something here
return View();
}
public ActionResult PartTwo() {
// do something here
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
我的javascript:
$(document).ready(function () {
$.ajax({
url: "/Home/PartOne",
cache: false,
success: function (data, textStatus, request) {
$("#TestContainerOne").html(data);
}
});
$.ajax({
url: "/Home/PartTwo",
cache: false,
success: function (data, textStatus, request) {
$("#TestContainerTwo").html(data);
}
});
});
Run Code Online (Sandbox Code Playgroud)
我的index.aspx:
<h2>Home page</h2>
<div id="TestContainerOne"></div>
<div id="TestContainerTwo"></div>
Run Code Online (Sandbox Code Playgroud)
PartOne.ascx:
<h2>Part One</h2>
Run Code Online (Sandbox Code Playgroud)
PartTwo.ascx:
<h2>Part Two</h2>
Run Code Online (Sandbox Code Playgroud)
救命?
您应该使用只读会话状态或完全禁用它以获得Ajax请求的并行处理.默认情况下,服务器会锁定来自同一客户端的请求的会话状态,因此请求将按顺序执行.
这是通过使用SessionState属性修饰控制器来完成的:
[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class HomeController : Controller {
public ActionResult Index() {
// do something here
return View();
}
public ActionResult PartOne() {
// do something here
return View();
}
public ActionResult PartTwo() {
// do something here
return View();
}
}
Run Code Online (Sandbox Code Playgroud)