一直在用Session,对Session锁并没有太多的关注,可能是平时没有注意。前段时间突然发现,一个Ajax Get请求,直接访问地址,只需要几十ms,但是在页面中加载,却需要2s。最后定位到Session的问题。
具体的内容我在园里看了下别人的文章:http://blog.csdn.net/paolei/article/details/38052129
不过,也发现了一些问题。
比如,这个例子:
后端:
public class MyController : Controller { // GET: My public ActionResult Index() { return View(); } [HttpGet] public string GetTest1() { Thread.Sleep(1000); return "GetTest1"; } [HttpGet] public string GetTest2() { return "GetTest2"; } }
前端:
$.get("GetTest1", function (resp) { console.log(resp); // server response }); $.get("GetTest2", function (resp) { console.log(resp); // server response });
直接使用上面的代码,没有访问过Session,代码默认不进行Session锁,运行结果:
GetTest2
GetTest1
当在Controller中写Session后:
public ActionResult Index() { Session["A"] = "A"; return View(); }
运行结果:
GetTest1
GetTest2
然后按上文在Controller前加:[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)],再次运行,发现结果是一样的,说明ReadOnly是无效的。
其实也是,虽然是ReadOnly,但是代码中还是写了,这和ReadOnly显然是矛盾的,但是代码并不会报错,只是这个属性无效了。
后来,改成:[SessionState(System.Web.SessionState.SessionStateBehavior.Disabled)]
这时再运行,就直接报错了。
最后总结了一下,只要Controller中有Session的写,无论Controller前的SessionStateBehavior是什么,都会认为Session是可写的,会进行Session锁。 所以,如果真的对Ajax并发性能要求比较高的话,就不能用Session了吧。 所以,觉得SessionStateBehavior这个属性有点鸡肋呀。本人浅见,如果有高手希望指点一二。
后来,我对自己的应用想到了一个不是办法的办法,把另外一个Ajax加载比较慢的,使用timeout 20ms,这个是调用一个复杂的计算加载待办数的,另一个是加载页面列表数据,显然,用户一开始最想先看到列表数据。