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。感兴趣大家可以去找找,应该有很多。
ASP.NET MVC Controller Session问题的更多相关文章
- .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- 转载ASP.NET MVC中Session的处理机制
本文章转载自 http://www.cnblogs.com/darrenji/p/3951065.html ASP.NET MVC中的Session以及处理方式 最近在ASP.NET MVC项目中 ...
- Asp.net Mvc 自定义Session (二)
在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...
- 实现Asp.net Mvc分布式Session Redis群集
Redis群集实现Asp.net Mvc分布式Session Session的缺点 众所周知Asp.net Session默认存储在IIS中,IIS的重启会导致Session丢失. 如果你的网站使用了 ...
- ASP.NET MVC Controller的激活
最近抽空看了一下ASP.NET MVC的部分源码,顺带写篇文章做个笔记以便日后查看. 在UrlRoutingModule模块中,将请求处理程序映射到了MvcHandler中,因此,说起Controll ...
- ASP.NET MVC之Session State性能问题(七)
前言 这一节翻译一篇有关Session State性能问题的文章,非一字一句翻译. 话题 不知道我们在真实环境中是否用到了Session State特性,它主要用来当在同一浏览器发出多个请求时来存储数 ...
- ASP.NET MVC controller 之间传JS值
在ASP.NET MVC中有东西叫TempData,它的类型是TempDataDictionary,它与ViewData以及ViewBag的不同之处在于 它的内部是使用session来保存信息的,可以 ...
- ASP.NET MVC Controller激活系统详解1
一.引言 好久没有写博客了,前一段时间学习了Controller激活的一篇很好的博文(链接),在此做个学习总结. 二.Controller 2.1 IController Controller类型直接 ...
随机推荐
- jQuery Validate 表单验证插件----Validate简介,官方文档,官方下载地址
一. jQuery Validate 插件的介绍 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆 ...
- sphinx增量索引
首先建立一个计数表,保存数据表的最新记录ID CREATE TABLE `sph_counter` ( `id` int(11) unsigned NOT NULL, `max_id` int(1 ...
- [转]SQLServer SQL执行效率和性能测试方法总结
本文转自:http://www.zhixing123.cn/net/27495.html 对于做管理系统和分析系统的程序员,复杂SQL语句是不可避免的,面对海量数据,有时候经过优化的某一条语句,可以提 ...
- TestNG之Factory
如果我们的测试方法中,同一个变量需要很多个不同的测试数据,那么这些测试数据由谁提供呢,testng提供了factory的注解,下面我们来一探究竟. 一.单独使用Factory 1.新建一个含有@Fac ...
- 2014 Super Training #4 B Problem Arrangement --状压DP
原题:ZOJ 3777 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 题意:给每个题目安排在每个位置的value ...
- UVA 10405 Longest Common Subsequence --经典DP
最长公共子序列,经典问题.算是我的DP开场题吧. dp[i][j]表示到s1的i位置,s2的j位置为止,前面最长公共子序列的长度. 状态转移: dp[i][j] = 0 ...
- 基础KMP两道
1. HDU 1711 Number Sequence 代码: #include <iostream> #include <cstdio> #include <cstri ...
- IO流的练习5 —— 读取文件中的字符串,排序后写入另一文件中
需求:已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl” 请编写程序读取数据内容,把数据排序后写入ss.txt中. 分析: A:读取文件中的数据 B:把数 ...
- Android优化——UI检视利器:Hierarchy Viewer
在Android的SDK工具包中,有很多十分有用的工具,可以帮助程序员开发和测试Android应用程序,大大提高其工作效率.其中的一款叫 Hierachy Viewer的可视化调试工具,可以很方便地在 ...
- angular常见坑洞
由于版本不同,可能有些问题在某些版本下出现,某些版本下不出现. 指令不可平行(v1.3.2): 多个指令不能这样一个接着一个排下去: <div> <directive-one/> ...