iis7中session丢失的解决方法小结pc软件 文章资讯 手机软件

您当前的位置→图文中心网站专题网站建设iis7中session丢失的解决方法小结

iis7中session丢失的解决方法小结


2015/11/22  编辑:admin 来源:本站整理

问题描述: 

Windows Server 2008 +IIS +ASP.net +SQLServer2008搭建的内部WEB系统system。
用户Session总是丢失, 有可能是IIS的不稳定stable性将导致Session频繁丢失。

用的是Session=SQLSEVER, 即把Session保存到数据信息库。

解决处理方法:

1, 就在命令行进入如下地址(InstallSqlState.sql文件程序目录)
cd "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727"

2, 运行如下命令, 建造数据库 ASPState
osql -S ERPDBSERVER -U sa -P ***-i InstallSqlState.sql

3, 在IIS服务器配置session连载, 具体连接字符串参考页面生成的Server=ERPDBSERVER1;User ID=sa;Password=*****
(注:*号处填入数据库登录密码)

Session丢失的解决办法小结

最近在做ASP.NET项目时, 测试网站老是取不出Session中的值, 在网上搜索了一下, 去寻找到一些解决方法, 记录在这里。 最后使用存储在StateServer中的办法解决了问题。

SessionState 的Timeout), 其主要原因有三种

一:有些杀病毒软件会去扫描您的Web.Config文件, 那时Session肯定掉, 这是微软的说法。
二:程序内部里有让Session掉失的代码, 及服务器内存不足产生的。
三:程序有框架页面和跨域情况。

第一种解决办法是:使杀病毒软件屏蔽扫描Web.Config文件(程序运行时我自己也一定不要去编辑它)
第二种是检查代码有无Session.Abandon()之类的。
第三种是在Window服务中将ASP.NET State Service 启动。

就在今天遇到asp.net session丢失了, 之后又回来了, session里存储的是用户信息, 最后导致每次刷新是不同的用户或是未登录状态。 很让人吐血的问题。
搞了2天没搞出来, 最后重写了验证机制, 都放在了cookie里了, session不敢用了。
今天发现, 问题是由于布置设置iis6的 应用程序池内的性能内的最大web进程数导致的, 由于session默认是存放在web进程里的, 进程开多了, 导致session不能够共享, 每次刷新又由不同的进程来处理, 所以就导致刷新出来不同的用户, 前提是在本机登录过这些用户。
解决方法可以能够用stateserver或者用sqlserver模式来存储session。
由于google没搜到类似问题, 所以这里拿出来说一下这个让我头痛了2天, 最后修改了n多页面的问题。

asp.net session丢失网上收集
Asp.net 默认配置下, Session莫名丢失的原因及解决办法
正常操作情况下Session会无故丢失。 因为程序是在不停的被操作, 排除Session超时的可能。 另外, Session超时时间被设定成60分钟, 将不会这么快就超时的。

这一次到CSDN上搜了一下帖子, 发现好多人在讨论这个问题, 然后我又google了一下, 发现微软网站上也有类似的内容。

现在我就把原因和解决办法写出来。

原因:
由于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丢失。

哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:
1、配置文件中processModel标签的memoryLimit属性
2、Global.asax或者Web.config文件被更改
3、Bin文件夹中的Web程序(DLL)被修改
4、杀毒软件扫描了一些.config文件。
更多的信息请参考PRB: Session variables are lost intermittently in ASP.NET applications

解决办法:
前面说到的sessionState标签中mode属性可以有三个取值, 除了InProc之外, 还可以为StateServer、SQLServer。 这两种存Session的方法都是进程外的, 所以当aspnet_wp.exe重起的时候, 不会反应影响到Session。

现在请将mode设定为StateServer。 StateServer是本机的一个服务, 可以在系统服务里看到服务名为ASP.NET State Service的服务, 默认情况是不启动的。 当我们设定mode为StateServer之后, 请手工将该服务启动。

这样, 我们就能利用本机的StateService来存储Session了, 除非电脑重新启动或者StateService崩掉, 否则Session是不会丢的(因Session超时被丢弃是正常的)。

除此之外, 我们还可以将Session可以通过其他电脑的StateService来保存。 具体的修改是这样的。 同样还在sessionState标签中, 有个stateConnectionString='tcpip=127.0.0.1:42424'属性, 其中有个ip地址, 默认为本机(127.0.0.1), 您可以将其改成你所知的运行了StateService服务的电脑IP, 这样就可以实现位于不同电脑上的Asp.net程序互通Session了。

如果你有更高的要求, 有请求需要在服务期重启时Session也不丢失, 可以考虑将mode设定成SQLServer, 同样需要修改sqlConnectionString属性。 关于使用SQLServer保存Session的操作, 请访问这里。

在使用StateServer或者SQLServer存储Session时, 所有需要保存到Session的对象除了可以说是数据类型(默认的数据类型, 如int、string等)外, 都就一定要序列化。 只需将[Serializable]标签放到要序列化的类前就可以了。
如:
[Serializable]
public class MyClass
{
......
}
具体的序列化相关的知识请参这里。

至此, 问题解决。
关于asp.net Session丢失问题的总结
asp中Session的工作原理:
asp的Session是具有进程依赖性的。 ASP Session状态存于IIS的进程中, 也就是inetinfo.exe这个程序。 所以当inetinfo.exe进程崩溃时, 这些信息也就丢失。 另外, 重起或者关闭IIS服务都会造成信息的丢失。

asp.net Session的实现
asp.net的Session是基于HttpModule技术做的, HttpModule可以在请求被处理之前, 对请求来进行状态控制, 由于Session本身就是用来做状态维护的, 因此用HttpModule做Session是再合适不过了。

原因1:
bin目录中的文件被改写, asp.net有一种机制, 为了保证dll重新编译之后, 系统正常运行, 它会重新启动一次网站进程, 这时就一定会导致Session丢失, 所以如果有access数据库位于bin目录, 或者有其他文件被系统改写, 就会导致Session丢失

原因2:
文件夹选择中项中, 如果没有打开“在单独的进程中打开文件夹窗口”, 一旦新建一个窗口, 系统可能认为是新的Session会话, 而再也不能够访问本来的Session, 所以需要打开该选项, 否则会导致Session丢失

原因3:
似乎大部分的Session丢失是客户端引起的, 所以要从客户端下手, 看看cookie有没有打开

原因4:
Session的时间设置是不是有问题, 会不会因为超时造成丢失

原因5:
IE中的cookie数量限制(每个域20个cookie)可能导致session丢失

原因6:
使用web garden模式, 且使用了InProc mode作为保存session的方式

解决丢失的经验
1. 判断是不是原因1造成的, 可以在每次刷新页面的时候, 跟踪bin中某个文件的修改时间
2. 做Session读写日志, 每次读写Session都要记录下来, 并且要记录SessionID、Session值、所在页面、当前函数、函数中的第几次Session操作, 这样找丢失的原因会方便很多
3. 如果允许的话, 主张使用state server或sql server保存session, 这样不容易丢失
4. 在global.asa中加入代码记录Session的创建时间和结束时间, 超时造成的Session丢失是可以在SessionEnd中记录下来的。
5. 如果有些代码中使用客户端脚本, 如javascript维护Session状态, 就要尝试调试脚本, 是不是因为脚本错误引起Session丢失

相关文章
  • 微辣战魂III-狼子V1.6隐藏英雄密码微辣战魂III 狼子1.6攻略
  • 微辣战魂III-狼子V1.6隐藏英雄密码微辣战魂III 狼子1.6攻略
  • IIS7.5中对所有请求响应的JSON数据进行GZIP编码
  • 以成为macOS上最强的万能视频播放器而生的IINA
  • IIS7/iis7.5 gzip 不生效,时有时无解决方法
  • 厘米人AIi会消失吗 厘米人ai体验链接地址
  • IIS7配置Gzip压缩
  • 让IIS 7 如同IIS 8 第一次请求不变慢
  • Win7系统如何添加IIS功能
  • IIS7常用问题汇总
  • 发表评论
    阅读排行
    相关热门
    网站帮助 - 广告合作 - 下载声明 - 网站地图