C# 页面跳转Session丢失
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 页面跳转Session丢失相关的知识,希望对你有一定的参考价值。
程序用的是MVC3,我登录使用的是js方式来登录,
登录成功后把整个用户对象写入到Session里面,
Session[ConfigUtility.GetValue("PassportCookie")] = userToken;
并且把当前回话的SessionID返回出来,
然后登录成功后跳转到控制器内有继承了一个控制器,该控制器主要就是获取Session内的登录用户对象
但是出现一个现象,SessionID已经改变了,就导致了我获取不到Session。而这个问题在本地运行项目是正常的,部署到服务器上会出现个别机子的IE浏览器内会获取不到Session,然后我把SessionID返回回来,发现SessionID已经改变了。
这个是登录成功后返回回来的SessionID
这个是登录跳转后到BaseController获取Session失败后跳转出来返回回来的SessionID
注意下,这个问题在本地项目运行和在本地的IIS内运行是正常的,部署到服务器上会出现个别机子的IE浏览器。
求高手解答。。
server下的IIS6默认设置下对每个运行在默认应用池中的工作者进程都会经过20多个小时后自动回收该进程,造成保存在该进程中的session丢失。
因为Session,Application等数据默认保存在运行该Web应用程序的工作者进程中,如果回收工作者进程,则会造成丢失。
解决办法:
修改配置,设置为不定时自动回收该工作者进程,比如设置为当超出占用现有物理内存60%后自动回收
该进程。通过使用默认应用程序池,可以确保多个应用程序间互相隔离,保证由于一个应用程序的崩溃不会影响另外的Web应用程序。还可以使一个独立的应用程序运行在一个指定的用户帐号特权之下。
如果使用StateServer方式或者Sql
Server数据库方式来保存Session,则不受该设置的影响。
可能的原因2:
系统要运行在负载平衡的
Web
场环境中,而系统配置文件web.config中的Session状态却设置为InProc(即在本地存储会话状态),导至在用户访问量大时,Session常经超时的情况。引起这个现象的原因主要是因为用户通过负载平衡IP来访问WEB应用系统,某段时候在某台服务器保存了Session的会话状态,但在其它的WEB前端服务器中却没有保存Session的会话状态,而随着并发量的增大,负载平衡会当作路由随时访问空闲的服务器,结果空闲的服务器并没有之前保存的Session会话状态。
解决办法:
1.当您在负载平衡的
Web
场环境中运行
ASP.NET
Web
应用程序时,一定要使用
SqlServer
或
StateServer
会话状态模式,在项目中我们基于性能考虑并没有选择SqlServer模式来存储Session状态,而是选择一台SessionStateServer
服务器来用户的Session会话状态。我们要在系统配置文件web.config中设置如下:
<sessionState
mode="StateServer"
cookieless="false"
timeout="240"
stateConnectionString="tcpip=192.168.0.1:42424"
stateNetworkTimeout="14400"
/>
还要添加一项
<machineKey
validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4"
decryptionKey="5FC88DFC24EA123C"
validation="SHA1"/>
2.
我们同时还要在SessionStateServer
服务器中启动ASP.NET
State
Service服务,具体设置:控制面板>>管理工具>>服务>>ASP.NET
State
Service,把它设为自动启动即可。
3.
每台前端WEB服务的Microsoft“Internet
信息服务”(IIS)设置
要在
Web
场中的不同
Web
服务器间维护会话状态,Microsoft“Internet
信息服务”(IIS)
配置数据库中
Web
站点的应用程序路径(例如,\LM\W3SVC\2)与
Web
场中所有
Web
服务器必须相同。大小写也必须相同,因为应用程序路径是区分大小写的。在一台
Web
服务器上,承载
ASP.NET
应用程序的
Web
站点的实例
ID
可能是
2(其中应用程序路径是
\LM\W3SVC\2)。在另一台
Web
服务器上,Web
站点的实例
ID
可能是
3(其中应用程序路径是
\LM\W3SVC\3)。因此,Web
场中的
Web
服务器之间的应用程序路径是不同的。我们必须使Web
场Web
站点的实例
ID
相同即可。你可以在IIS中把某一个WEB配置信息保存为一个文件,其他Web
服务器的IIS配置可以来自这一个文件。您如果想知道具体的设置请访问Microsoft
Support网站。 参考技术A 虽然不太明白你是怎么实现的操作,但是从结果上看,如果是SessionID变化了,那就基本上是一种可能性
会话的实现方式基本上是,每次服务器会返回给请求人一个值,下次请求人再把这个值发回来,以保证两次请求是同一个人,这里如果能明白的话,后面就好办了
你用的那个请求的东西,很可能没有记下这个值,也没有发送这个值。。所以服务器永远认为这是一个全新的请求,所以再次分配 他一个新的SessionID 参考技术B Session是保存在服务器上的,可能是因为服务器当时较忙会导致session的丢失。session本来就是容易丢失,不要多用。
Linux下Session丢失原因
最近碰到一个问题,把代码迁移到linux系统下,重新搭建php环境,运行代码,
在登录页面时,不能访问后台,会返回到登录页面,对代码测试,没有报任何错误,
最后检查到是跳转时,session丢失的问题,如何会丢失呢?带着这个问题,查了大量资料,
发现造成这个原因有这几种:
1.session存储路径(目录)不存在,自然就无法生成session临时文件
2.session存储路径下有没有权限,如果没有,也就不可能存储session数据
3.能正常存session数据,但session存入后被清空
解决方案:
首先,在项目根目录下创建phpinfo.php文件,在文件中写入phpinfo(),运行此文件,查看页面,
就可以找到session的存储路径,
其次,进入linux中查找session存储路径是否存在,不存在创建存储目录,并分配权限,
如果有session存储路径,就查看其是否有权限,没有就分配权限,
最后,是否是第三个原因,可在phpinfo.php页面中查找date.timezone是否设置不对,
然后在php.ini配置文件中找到date.timezone进行配置
我的项目中遇到的就是第一种情况,因而,我就创建存储目录,并分配权限,问题就解决了。
希望本编博客对大家能有所帮助。
最后,提醒下各位,不要在配置文件中找session存储路径,上述方法找的session存储路径准确,
我花了大量时间才解决问题就是配置文件中的session存储路径和上述方法找到的session存储路径不同,
所以才一直没有解决问题。
以上是关于C# 页面跳转Session丢失的主要内容,如果未能解决你的问题,请参考以下文章
asp中session超时怎样写,超时后怎样跳转到指定页面?