一直在用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,这个是调用一个复杂的计算加载待办数的,另一个是加载页面列表数据,显然,用户一开始最想先看到列表数据。

05-02 04:35