您的位置:首页 > 其它

谈谈Session丢失的问题

2010-02-24 20:29 393 查看
今天遇到了session丢失的问题,我明明设置了session.timeout=120(2小时) 可是用户总是说20分钟左右就无法操作了,这就是"session丢失"。 默认情况下sessionState 的mode=InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。

诱发该进程重启的原因很多:
(1)
asp.net 会监视应用程序目录,一但有被监视的动作发生(比如:修改了web.config或global.asax,重命名目录,修改bin里的文夹等)应用程序就会自动重起当然这时你的session一定丢失了。如果避免不了这种操作(如:重命名目录);这里我们可以用cookie存信息或存到数据库去;另外,目录的删除操作一定丢失session。
asp.net的内部机制对待目录有点像个守财奴,它死守着目录,你创建它不会管(往里加),一但创建他就会监视该目录,若你要删除或重命名它的(动它的目录),它就发生重启了。。

(2)跨域
在开发中,我们经常会遇到使用Frame来工作,而且有时是为了跟其他网站集成,应用到多域的情况下,而Iframe是不能保存Session的。一般为重启了应用程序,这时,如果web.config中sessionState的mode="Inproc"则会丢失session.另外网上还有人说js中:window.locationlhref="url'也会导致session丢失,这个我还没有试验,如果是这样,也应该是跨域导致的应用程序重启吧。
(3)杀毒软件扫描了一些.config文件。

解决session丢失的问题方法有多种,我喜欢用这两种
1)将session保存在一台sate server中。
2)将session保存在sql server中。
首先对webconfig文件中session部分进行修改。如下:|
<sessionState
mode="StateServer"
cookieless="false"
timeout="240"
stateConnectionString="tcpip=10.164.222.122:42424"
stateNetworkTimeout="14400"
/>
然后再在10.164.222.122 这台电脑上的asp.net state server 服务启动(如果使用本地服务器作为stateserver,则tcpip=1274.0.0.1:42424

)这样基本上就行了。

我用了一个测试程序,在3个小时以后session仍然可用,更绝的是如果StateServer在其它主机上,网站所在的服务器重启,也不会导致

session丢失!!
这让我想起了曾经的一个面试题:
如何使跨服务器网站的各网页间共享session?
只要在各服务器的web.config文件中,stateserver都指定为同一个IP(这个IP的主机开启了ASP.NET 状态服务)
即:在web.config中设置节<sessionState mode="StateServer" stateConnectioniString="tcpip=状态服务器的IP:42424" />就可以了

扩展阅读:

.NET Framework 常规参考

<sessionState> 元素
为当前应用程序配置会话状态设置。

<configuration>
<system.web>
<sessionState>

<sessionState mode="Off|InProc|StateServer|SQLServer"
cookieless="true|false"
timeout="number of minutes"
stateConnectionString="tcpip=server:port"
sqlConnectionString="sql connection string"
stateNetworkTimeout="number of seconds"/>
必选属性
属性 选项 说明
mode 指定在哪里存储会话状态。
Off 指示会话状态未启用。
InProc 指示在本地存储会话状态。(windows有一个进程专门负责管理会话状态 )
StateServer 指示在远程计算机上存储会话状态。
SQLServer 指示在 SQL Server 上存储会话状态。

可选属性
属性 选项 说明
cookieless 指定不具有 Cookie 的会话是否应用于标识客户端会话。
true 指示应使用不具有 Cookie 的会话。
false 指示不应使用没有 Cookie 的会话。默认值为 false。
timeout 指定在放弃一个会话前该会话可以处于空闲状态的分钟数。默认值为 20。
stateConnectionString 指定远程存储会话状态的服务器名称和端口。例如“tcpip=127.0.0.1:42424”。当 mode 为 StateServer 时该属性

是必需的。
sqlConnectionString 为 SQL Server 指定连接字符串。例如“data source=localhost;Integrated Security=SSPI;Initial

Catalog=northwind”。当 mode 为 SQLServer 时该属性是必需的。
stateNetworkTimeout 在使用 StateServer 模式存储会话状态时,指定在放弃会话之前 Web 服务器和状态服务器之间的 TCP/IP 网络连接空

闲的时间(以秒为单位)。默认值为 10。

备注
使用 StateServer 模式

确保运行 ASP.NET 状态服务的服务器是要存储会话状态信息的远程服务器。该服务与 ASP.NET 一起安装,其默认位置为 <驱动器

>:/systemroot/Microsoft.NET/Framework/version/aspnet_state.exe。
在应用程序的 Web.config 文件中,设置 mode=StateServer 并设置 stateConnectionString 属性。例如,

stateConnectionString="tcpip=sarath:42424"。
使用 SQLServer 模式

在运行 SQL Server 的计算机(它将存储会话状态)上运行 InstallSqlState.sql(默认的安装位置为 <驱动器

>:/systemroot/Microsoft.NET/Framework/version)。这将创建一个名为 ASPState 的数据库,该数据库具有新的存储过程并且在 TempDB 数

据库中具有 ASPStateTempApplications 表和 ASPStateTempSessions 表。
在应用程序的 Web.config 文件中,设置 mode=SQLServer 并设置 sqlConnectionString 属性。例如,sqlConnectionString="data

source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。
示例
以下示例指定若干会话状态配置设置。

<configuration>
<system.web>
<sessionState mode="InProc"
cookieless="true"
timeout="20"/>
</sessionState>
</system.web>
</configuration>
要求
包含于:<system.web>

Web 平台:IIS 5.0、IIS 5.1、IIS 6.0

配置文件:Machine.config、Web.config

配置节处理程序:System.Web.SessionState.SessionStateSectionHandler

在Windows2003的服务器中的IIS6加入了应用程序池来回收一些无用的进程的功能,当由于网站程序的错误或访问量太多的导致的应用程序池会

自动回收该进程,防止网站进入“死机”状态,而这时候的应用程序池的回收就会导致session变量被清除,就出现了session变量不见的现象


为了解决这种在Windows2003下才出现的问题,我们在服务端起动ASP.NET State Service服务,并且在系统的machine.config做了一些改动。

现在默认的情况下会话状态mode是StateServer。如果您的网站根目录下也配有一个web.config配置文件,请把mode="InProc"改成

mode="StateServer",如下代码,就可以防止session变量的丢失:
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI"
cookieless="false"
timeout="30"
/>

注:只适用于支持asp.net的用户。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: