我有一个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();
}
}
我的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);
}
});
});
我的index.aspx:
<h2>Home page</h2>
<div id="TestContainerOne"></div>
<div id="TestContainerTwo"></div>
PartOne.ascx:
<h2>Part One</h2>
PartTwo.ascx:
<h2>Part Two</h2>
帮助?
答案 0 :(得分:7)
您应该使用只读会话状态或完全禁用它,以便并行处理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();
}
}