当前位置 主页 > iis相关 >

iis7中session数据丢失怎么解决?

时间: 2018-11-28 15:00 栏目:iis相关

  问题描述:
  Windows Server 2008 +IIS +ASP.net +SQLServer2008搭建的内部WEB系统。
  用户Session总是丢失,可能是IIS的不稳定性将导致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丢失
缩小 缩小 缩小 缩小
IIS7整站下载工具 IIS7批量查询排名 IIS7远程桌面连接工具 iis7-iis网站批量管理 iis7批量替换工具 IIS7服务器专用下载工具 IIS7日志分析工具 IIS7批量PING,服务器批量添加网卡IP小工具 IIS7远程同步备份工具
IIS7网站监控 站群批量SEO查询 批量获取排名域名 批量关键词排名查询 模拟各种蜘蛛 批量友情链接监测 批量检测死链 搜索引擎大全 批量查询外链
批量查询网站标题 批量查询KeyWords 批量查询描述 批量查询网站IP 批量百度收录查询 批量查询百度日收录 批量查询百度周收录 批量查询百度月收录 批量查询360总收录 批量查询360日收录 批量查询网站年龄 批量查询360PC权重 批量查询爱站移动权重 批量查询站长移动权重 批量查询360移动权重 批量查询神马权重 批量查询谷歌PR 批量查询搜狗PR 批量查询百度反链 批量查询爱站首页反链 批量查询爱站内页反链 批量查询百度快照 批量查询搜狗快照 批量icp备案查询 批量网站ip地址查询 批量查询导出链接 批量查询百度V认证 批量查询百度安全 批量查询站长PC权重 批量查询爱站PC权重 批量查询搜狗总收录 站长资源大全 IIS7-cms大全 IIS7站群大全 IIS7虚拟空间大全 IIS7服务器大全 IIS7-VPS大全