Session丢失问题解决
最近在开发供给第三方调用的单点登录的接口,发现在页面跳转的时候session丢失,于是开始寻找原因。
首先,Debug后发现,是在这段代码执行过后:
Response.Write("<script type='text/javascript'>window.top.location.href='"+Request.ApplicationPath+"/teacher_index.aspx'</script>"),Session丢失。
分析原因应该是页面在跳转的时候,中止了Response请求,然后重新发起了一个http请求,结果导致Session丢失。随后用httpwatch监控发现果然如此。
然后,在网上寻找有没有相关的解决办法,发现一些解决办法:
一种方法是从另外一种思路来解决这个问题。不使用W3wp.exe来保存Session
由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下:
<sessionState mode='InProc' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='60'/>
我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感)。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。
现在将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,手工将该服务启动。
这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。
如果要在现有的情况下不修改配置文件,不启动windows服务来解决这个问题。于是就想到了Response.Redirect的一个重载,将参数endResponse设为false,结果发现还是丢Session。
于是仔细观察了httpwatch中截获的请求,发现Cookies选项中在跳转之前是空的,这个里面应该存储了当前session的id才对,于是就想如果我在Redirect之前就将session的id放到Cookies中是不是就能解决这个问题了呢。果然不出所料,修改完后问题解决了。
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", Session.SessionID)); Response.Redirect(Request.ApplicationPath + "/teacher_index.aspx",false);
后来想到,这个问题还有一个比较简单的解决办法就是:
Server.Transfer("father_index.aspx")
posted on 2012-07-27 16:36 jiayang44 阅读(1727) 评论(5) 编辑 收藏 举报