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")

 

     

转载于:https://www.cnblogs.com/jiayang/archive/2012/07/27/2612062.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值