在Windows2003的服务器中的IIS6加入了应用程序池来回收一些无用的进程的功能,当由于网站程序的错误或访问量太多的导致的应用程序池会自动回收该进程,防止网站进入“死机”状态,而这时候的应用程序池的回收就会导致session变量被清除,就出现了session变量不见的现象。
为了解决这种在Windows2003下才出现的问题,我们在服务端起动ASP.NET State Service服务,并且在系统的machine.config做了一些改动。现在默认的情况下会话状态mode是StateServer。如果您的网站根目录下也配有一个web.config配置文件,请把mode="InProc"改成mode="StateServer",如下代码,就可以防止session变量的丢失:
即: 改为
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>
序列化的问题
1 在StateServer或者SQLServer模式的时候保存在Session里面的对象必须支持序列化!如果是内置的类创建的对象,则必须是支持序列化的对象;如果是自己定义的类创建,则可以在定义该类的时候标识如下:
[Serializable]
public class YourClass
{
//class code
}
[Serializable] 标识该类创建的对象是可以序列化的。
2 DataRow确实不能直接序列化,DataTable和DataSet才可以直接序列化,所以在类中最后不要直接使用DataRow类型作为属性。