- 引子
我们来看两个ajax方法,先后的问题,会有什么样的结果?
Javascript:
$(function () {
//第一个
$.ajax({
type: "POST",
url: "/Home/Method1",
success: function (msg) {
$('#m1').html('第一个方法完成');
}
});
//第二个
$.ajax({
type: "POST",
url: "/Home/Method2",
success: function (msg) {
$('#m2').html('第二个方法完成');
}
});
});
服务端
public class HomeController : Controller
{
//
// GET: /Home/ public ActionResult Index()
{
Session["test"] = ;
return View();
} public ActionResult Method1()
{
Thread.Sleep();
return Json("");
} public ActionResult Method2()
{
return Json("");
} }
本以为:两个ajax是异步请求,谁先处理完,就谁先返回回来。
可是现实却大大出乎我的意料。见下图。
明显第二个请求是等第一个请求处理完了,才执行的。
- 根源
其实问题是出现在Session上,那么我们把Session["test"] 去掉,这样再看结果:
原来妖孽就是Session,同一会话,即请求的SessionId是相同的,都会初始化Session对象,并锁住Session对象;其他同一会话的请求要用到Session对象,只能等待。因此才会出现前面的情况。
- 解决
只需要标识当前会话session行为为只读行为,就不会加锁
[SessionState(SessionStateBehavior.ReadOnly)]
[SessionState(SessionStateBehavior.ReadOnly)]
public class HomeController : Controller
{
//
// GET: /Home/ public ActionResult Index()
{
Session["test"] = ;
return View();
} public ActionResult Method1()
{
Thread.Sleep();
return Json("");
} public ActionResult Method2()
{
return Json("");
}
}
结果符合表述,如下图: