发现问题

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

  测试那边给出的问题是这样的:每天早上来的时候,第一次通过单点登录到系统的时候,总会跳转回登录界面,再次登录就好了。当时给我的第一印象是,好怪啊,不过应该是系统中的问题,根据描述,我这边也测试了,不过在我这里就是不重现这个问题。昨天下班后,自己在研究别的问题,突然感觉的一丝灵感,既然是每天第一次出现问题,应该是什么东西过期了,才会导致这样的问题。就想到了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。感兴趣大家可以去找找,应该有很多。

ASP.NET MVC Controller Session问题的更多相关文章

  1. .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  2. 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  3. 转载ASP.NET MVC中Session的处理机制

    本文章转载自 http://www.cnblogs.com/darrenji/p/3951065.html ASP.NET MVC中的Session以及处理方式   最近在ASP.NET MVC项目中 ...

  4. Asp.net Mvc 自定义Session (二)

    在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...

  5. 实现Asp.net Mvc分布式Session Redis群集

    Redis群集实现Asp.net Mvc分布式Session Session的缺点 众所周知Asp.net Session默认存储在IIS中,IIS的重启会导致Session丢失. 如果你的网站使用了 ...

  6. ASP.NET MVC Controller的激活

    最近抽空看了一下ASP.NET MVC的部分源码,顺带写篇文章做个笔记以便日后查看. 在UrlRoutingModule模块中,将请求处理程序映射到了MvcHandler中,因此,说起Controll ...

  7. ASP.NET MVC之Session State性能问题(七)

    前言 这一节翻译一篇有关Session State性能问题的文章,非一字一句翻译. 话题 不知道我们在真实环境中是否用到了Session State特性,它主要用来当在同一浏览器发出多个请求时来存储数 ...

  8. ASP.NET MVC controller 之间传JS值

    在ASP.NET MVC中有东西叫TempData,它的类型是TempDataDictionary,它与ViewData以及ViewBag的不同之处在于 它的内部是使用session来保存信息的,可以 ...

  9. ASP.NET MVC Controller激活系统详解1

    一.引言 好久没有写博客了,前一段时间学习了Controller激活的一篇很好的博文(链接),在此做个学习总结. 二.Controller 2.1 IController Controller类型直接 ...

随机推荐

  1. linux下批量修改存有超大数据量IP文件中的IP内容以及去重排序

    作为一个linux的学徒,分享一下自己解决这个小问题的心得,在处理这个问题时使用了一个小技巧感觉很适用,个人发觉linux的终端真滴是非常强大,下面就详细地介绍这个问题以及解决办法吧 问题描述:由于要 ...

  2. 简答哈希实现 (nyoj 138 找球号2)

    例题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=138 代码目的:复习哈希用 代码实现: #include "stdio.h&qu ...

  3. multiprocessing module in python(转)

    序.multiprocessing python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好用的多进程包mu ...

  4. 获取bing每日图片

    http://global.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-US 其中idx表示倒数第几张图片 ...

  5. Webshell实现与隐藏探究

    一.什么是webshell webshell简介 webshell,顾名思义:web指的是在web服务器上,而shell是用脚本语言编写的脚本程序,webshell就是就是web的一个管理 工具,可以 ...

  6. virtualbox 在window10上的兼容性调整

    更新完windows10后,打开当时的virtualbox 4.3.3已经是最新的啦,打开原来安装的几个虚拟机(hadoop),发现均失败. 打开setting一看,网络一栏有问题,桥接模式的虚拟机都 ...

  7. 如何做好presentation

    1.全心投入 要么不做,要做就做好 承诺自己会花时间好好准备自己的演讲,投入专注的精力. 人们可以通过练习使自己成为很好的演讲者. 2分析你的观众 他们想听什么? 3.组织你的想法 让语言简单 让观众 ...

  8. Ubuntu 12.04 DNS服务器的配置方法

    Bind是一款开放源码的DNS服务器软件,由美国加州大学Berkeley分校开发和维护的,全名为Berkeley Internet Name Domain它是目前世界上使用最为广泛的DNS服务器软件, ...

  9. [麦先生]LINUX常用命令总结

    在系统的学习了如何搭建和利用LINUX进行开发后,我利用xMind这一个强大的bug级软件制作了LINUX常见操作命令汇总,但是由于博客园并不支持xMind格式文件的上传,我只能将其做成图片进行分解上 ...

  10. gunplot demo

    //author : Leon yangli0534@gmail.com #include <stdlib.h> #include <stdio.h> #include < ...