HTTP是一种无状态的协议,因此在不同请求之间无法共享状态,然而维护不同请求之间的状态是很有用的。比如购物网站中购物车的实现就要依赖这种状态实现。
应用程序状态管理
想必很多人对下面的代码段很熟悉:
Application.Lock(); Application["MyGlobalCounter"] = (int)Application["MyGlobalCounter"] + 1; Application.UnLock();
Application是HttpApplicationState类的一个实例。它存在于一个Web应用程序的整个生命周期中。会话状态在浏览器中第一次请求一个应用程序时,服务器会开启一个会话,以后的请求都会共享这些会话状态。这批请求的第一个响应会返回一个SessionID,以后都会用这个SessionID做为Token访问这次会话的状态。SessionID的传递方式有两种:1)Cookie2)不使用Cookie,而是被插入到URL中传递到服务端。ASP.NET 支持三种会话状态模式:InProc,StateServer,SQLServer.
优点 缺点 InProc 1)从aspnet_wp.exe中直接读取,因此性能最好。 1)aspnet_wp.exe可能会由于多种原因,(比如虚拟目录中的web.config,Bin目录或者内存使用量达到最大里了)被回收。因此具有相当大的不稳定性。
2)不适用于Web Garden部署,更不适用于Web Farm部署。StateServer 1)这种模式下的会话变量存储在一个Windows服务中,独立于IIS,因此不会受IIS工作进程回收机制的影响。
2)适用于Web Garden和Web Farm两种部署模式。1)存在跨进程或跨机器(因为可以把这个Windows服务部署在另一个服务器上)问题,性能较低。 SQLServer 除拥有StateServer模式的1),2)优点外,还有以下优点:
3)更持久1)性能更低,因为要读SQL Server,反序列等等。
参考资料:http://msdn.microsoft.com/en-us/library/87069683(VS.71).aspx