asp.net session丢失的解决方法
sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer,SQLServer(大小写敏感) 。
默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),
这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。
解决办法:
将服务器Session信息存储在进程外
1、将mode 设为StateServer
首先,让我们来打开管理工具->服务,找到名为:ASP.NET State Service的服务,启动它。实际上,这个服务就是启动一个要保存Session信息的进程。启动这个服务后,你可以从Windows任务管理器->进程中看到一个名为aspnet_state.exe的进程,这个就是我们保存Session信息的进程。
然后,回到Web.config文件中上述的段落中,将mode的值改为StateServer。保存文件后的重新打开一个IE,打开SessionState.aspx页面,保存一些信息到Session中。这时,让我们重起IIS,再回到SessionState.aspx页面中查看刚才的Session信息,发现没有丢失。
web.config中的具体设置
<sessionState mode="StateServer" timeout= "60" cookieless="false"
stateConnectionString="tcpip=127.0.0.1:42424 ">
</sessionState>
但发现运行中出现下面的错误
无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。
到网上去搜索了这个错误,说是session没有序列化的原因,要加上[Serializable]标记
namespace 命名空间
{
[Serializable]
public class 类名
{
。。。。
}
}
修改了后程序还是出现上述错误,经过调试发现在程序中我使用session存储了一个DATAVIEW,把这行去掉程序就运行正常了。
实际上,这种将Session信息存储在进程外的方式不光指可以将信息存储在本机的进程外,还可以将Session信息存储在其他的服务器的进程中。这时,不光需要将mode的值改为StateServer,还需要在stateConnectionString中配置相应的参数。例如你的计算你是192.168.0.1,你想把Session存储在IP为192.168.0.2的计算机的进程中,就需要设置成这样:stateConnectionString="tcpip=192.168.0.2:42424"。当然,不要忘记在192.168.0.2的计算机中装上.NET Framework,并且启动ASP.NET State Services服务。
---------------------------------------------------------路漫漫 任重而道远------------