ASP.NET MVC Controller Session问题

  发现问题

  最近在项目中遇到这样一个问题,一直没办法重现,所以几天都没有解决。

  测试那边给出的问题是这样的:每天早上来的时候,第一次通过单点登录到系统的时候,总会跳转回登录界面,再次登录就好了。当时给我的第一印象是,好怪啊,不过应该是系统中的问题,根据描述,我这边也测试了,不过在我这里就是不重现这个问题。昨天下班后,自己在研究别的问题,突然感觉的一丝灵感,既然是每天第一次出现问题,应该是什么东西过期了,才会导致这样的问题。就想到了session,而session的工作原理是根据本地保存的sessionId,于是我清了浏览器的缓存和Cookie,结果问题真的重现了。对于系统问题来说,只要能重现,就算解决了一半了。

  根据我的想法,我跟踪了session的保存和读取,在LoginController中保存用户session,页面跳转到HomeController中读取session,就在这里发现了问题,在这个控制器里面根本读取不到session,这是什么问题呢?于是想到了MVC的工作机制,由于我们的访问经过路由处理器处理后,生成了响应的相应URL的实例MVCRouteHandle,对于System.Web.HttpContext.Current.Session["userinfo"]这样的方式,访问的只能是当前访问的Request的包装HttpContext中的东西,想要访问另一个路由或者说URL中Session是不行的。

  解决问题

  1、 public ActionResult Index()
        {

            if (Login())
            {
                return Redirect("/Home/Main");
            }
            else
            {
                Response.Redirect(_logoutUrl);
            }
            return null;
        }

  这种方式采用了Redirect方式进行跳转,其实并不属于跳转,它是将"/Home/Main"页面的内容作为当前Action的返回值,这样就属于同一个访问域下了,Session自然能够取到;

  2、这是我从Stack Overflow上找到的一个方式,意思就是在BaseController中定义一个HttpSessionStateBase的变量用于存储Session,这种方式需要我们的Controller都是继承自BaseController,这样也是可以的。

    这里要说明一下HttpSessionStateBase是在system.web命名控件下的一个类,在system.web,mvc下的抽象类Controller下,其实已经给我们定义好了一个Session只读属性。

    

    我们可以直接使用它,所以在使用的过程中,各位要注意自己应用的使这个还是System.Web.HttpContext.Current.Session!!!

  3、我找了一些资料,网上还有一种方式是利用SessionHelper来实现的,我看了源代码,里面的实现方式是利用cookie。感兴趣大家可以去找找,应该有很多。

 

posted @ 2015-05-20 12:37  H:JL  阅读(4922)  评论(0编辑  收藏  举报