asp.net MVC Session锁的问题

Posted WileyWong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net MVC Session锁的问题相关的知识,希望对你有一定的参考价值。

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

 

以上是关于asp.net MVC Session锁的问题的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net Mvc 自定义Session

Asp.net Mvc 自定义Session ,

ASP.NET MVC动作方法使用Session在其它方法中无法取值

在 ASP.NET MVC 站点中实现 Session 的公认模式是啥?

ASP.NET MVC 的 AsyncController 和 Session 数据

[转]菜鸟程序员之Asp.net MVC Session过期异常的处理