ASP.NET 状态服务 及 session丢失问题解决方案总结
最近在开发一ASP.NET2.0系统时,在程序中做删除或创建文件操作时,出现session丢失问题。在网上搜了不少资料,最后终于解决了,采用了如下方法:
1、
asp.net Session
的实现:
asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。
asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。
ASP.NET
提供了
Session
对象,从而允许程序员识别、存储和处理同一个浏览器对象对服务器上某个特定网络应用程序的若干次请求的上下文信息。
Session
对应浏览器与服务器的同一次对话,在浏览器第一请求网络应用程序的某个页面时,服务器会触发
Session_onStart
事件;在对话超时或者被关闭的时候会触发
Session_onEnd
事件。
程序员可以在代码中响应这两个事件来处理与同一次对话相关的任务,如开辟和释放该次对话要使用的资源等。
在
ASP.NET
的程序中要使用
Session
对象时,必须确保页面的
@page
指令中
EnableSessionState
属性是
True
或者
Readonly
,并且在
web.config
文件中正确的设置了
SessionState
属性。
ASP.NET
中
Session
的状态保持是由
web.config
文件中的
<system.web>
标记下的
<sessionstate>
标记的
mode
属性来决定的。该属性有四种可能的值:
Off
、
Inproc
、
StateServer
和
SQlServer.
设为
Off
会禁用
Session.
Inproc
是缺省的设置
,
这种模式和以前的
ASP
的会话状态
的方法是类似的
,
会话的状态会被保存在
ASP.NET
进程中,它的优点是显而易见的:性能。进程内的数据访问自然会比夸进程的访问快。
然而,这种方法
Session
的状态依赖于
ASP.NET
进程,当
IIS
进程崩溃或者正常重起启时,保存在进程中的状态将丢失。
为了克服
Inproc
模式的缺点,
ASP.NET
提供了两种进程外保持会话状态的方法。
ASP.NET
首先提供了提供了一个
Windows
服务:
ASPState
,
这个服务启动后,
ASP.NET
应用程序可以将
mode
属性设置为
“SateServer”,
来使用这个
Windows
服务提供的状态管理方法。
除了在
web.config
文件中设置
mode
属性为
StateServer
外,还必须设置运行
StateServer
服务器的
IP
地址和端口号
.
如果在
IIS
所在的机器运行
StateServer
则
IP
地址就是
127.0.0.1,
端口号通常是
42424.
配置如下:
mode=”StateServer”
stateConnectionString="tcpip=127.0.0.1:42424"
使用这种模式
,
会话状态的存储将不依赖
IIS
进程的失败或者重启
,
会话的状态将存储在
StateServer
进程的内存空间中。
另一种会话状态模式是
SQLServer
模式。这种模式是将会话的状态保存在
SQL Server
数据库中的。使用这种模式前,必须至少有一台
SQL Server
服务器,并在服务器中建立需要的表和存储过程。
.NET SDK
提供了两个脚本来简化这个工作:
InstallSqlState.sql
和
UnInstallSqlState.sql
。这两国文件存放在下面路径中:
<%SYSTEMDRIVER%>/Winnt/Microsoft.NET/Framework/<%version%>/
要配置
SQL Server
服务器,可以在命令行中运行
SQL Server
提供的命令行工具
osql.exe
osql -s [server name] -u [user] -p [password] <InstallSqlState.sql
例如:
osql -s (local) -u as -p “”-i InstallSqlState.sql
做好必要的数据库准备工作后,将
web.config
文件中的
sessionstate
元素的
mode
属性改为
”sqlserver”,
并指定
SQL
连接字符串。具体如下:
mode="SQLServer"
sqlConnectionString="data source=127.0.0.1;userid=sa;password=;Trusted_Connection=yes"
使用
SQLServer
模式处了可以使
Session
的状态不依赖于
IIS
服务器之外,还可以利用
SQL Server
的集群,使状态存储不依赖于单个的
SQL Server,
这样就可以为应用程序提供极大的可靠性。
|
2、
丢失原因:
转(
1
):
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 丢失。 |