ASP.NET应用中会话状态丢失及解决策略

会话易丢失,解决办法

一.

了解下Web园

一个应用程序池默认是开启一个工作进程,但也可以开启多个工作进程,这样可提高性能,这个功能名为Web园,是小型的“Web农场”,您无需使用多台计算机来传送相同内容(Web农场),而是可以使用一台计算机中的多个进程来传送相同内容。
配置Web园:

IIS->应用程序池->选中使用的应用程序池->右键属性->性能->Web园->最大工作进程数

设置最大进程数大于1,如果这个值大于1,每个请求将启动一个新的工作进程实例,可启动的最多进程数位您所设置的进程数,最大可设置为4000000.后续请求将以循环的方式发送至工作进程。但使用Web园要考虑以下两点:

  1. )每一个工作进程都会消耗系统资源和CPU占用率,太多的工作进程不仅会导致系统资源和CPU利用率急剧消耗,还会造成资源竞争;
  2. )每一个工作进程都具有自己的状态数据,由于请求以循环的方式路由到应用程序池工作进程,这就造成数据不一致,比如session丢失等;

还有些朋友发现有多个w3wp进程,很不理解,有些朋友甚至认为是病毒。其实这完全和Web园的设置有关,一个工作进程就是一个w3wp.

二.

ASP.NET提供了5种会话状态选项:

InProc

StateServer

SQLServer

Custom

Off

1. InProc

InProc选项支持在进程内保存会话状态,实际上是在w3wp.exe工作进程中保存会话状态。这意味着保存会话状态数据将分别保存在每台服务器中,因此其他服务器无法访问当前服务器会话状态数据。这还意味着一个应用程序池回收操作将导致会话状态的丢失。在不考虑Off选项的情况下,这种解决方案运行速度最快,但是,除非我们应用粘性会话机制,否则这种解决方案无法在Web farm环境中正常工作。如果使用了粘性会话机制、同时没有使用Web garden的话,那么InProc是一个可行的解决方案。

如果需要在web.config文件或者其他配置文件中设置会话状态,可以在配置文件的<system.web>配置节中添加一个sessionState标记,如下面的代码所示。

<configuration>

<system.web>

<sessionState mode="InProc" />

</system.web>

</configuration>

2. StateServer

StateServer是微软公司提供的另一种解决方案,但是这种解决方式没有提供故障转移的功能。当在服务器中成功地安装了ASP.NET之后,Windows Services将增加一项名为ASP.NET State Service的服务,默认情况下,这个服务处于禁用状态,但是可以随时启用这项服务。我们需要将该服务的启动模式设置为Automatic,这样每次系统重启时,这项服务都会自动启动。

设置步骤: Run->services.msc->ASP.NET 状态服务(启用,并,设置自动)(找到服务,按名称排序)

默认情况下,ASP.NET SessionState服务是无法远程访问的,如果需要远程运行ASP.NET SessionState服务,那么需要在注册表中将HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection的值设为1。

<sessionState mode="StateServer" />

如果不打算在本地服务器中使用默认的状态服务器,那么可以根据需要设置参数。<sessionState mode="StateServer" stateConnectionString="

tcpip=10.0.0.10:42424" />

本地服务器有时会出现:

HTTP 错误 500.0 - Internal Server Error

调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "C:\PHP\php5isapi.dll" 上

此时在该文件夹加入匿名用户的只读访问权限

3. SQLServer

微软提供的第三个解决方案是SQLServer会话状态。如果当前应用程序运行环境中使用了一个SQLServer群集,那么这种解决方案是一种非常合适的解决方案。与其他方案相比,SQLServer会话状态的性能开销最高,但是因为SQLServer会话状态提供了冗余支持,所以这种方案对性能的影响也是微不足道的。在部署这种解决方案之前,请务必确保系统性能能够满足当前应用程序的要求,同时,还要保证系统具有良好的可伸缩性。

SQL Server会话状态的配置较为复杂,需要使用aspnet_regsql.exe工具

4. Custom

ASP.NET支持实现自定义的会话状态提供程序。所以,可以实现一种不同于微软解决方案的方案。与其他选项类似,一旦成功地开发了自定义的解决方案并将其安装部署到服务器中之后,那么,我们必须对网站的web.config文件以及应用程序根目录下的web.config文件进行更新,使之指向自定义的提供程序。

5. Off

可以完全关闭会话状态,在某些情况下这样做是有意义的,因为启用会话状态后,即使我们没有使用会话状态,系统性能也会有所下降。为了关闭会话状态,我们可以按照"InProc"一节的内容进行操作,唯一不同之处是选择Off而不是选择In Process。在IIS Manager中,这种做法被称为Not enabled。

三、

第三方会话状态解决方案

ScaleOut Software(www.scaleoutsoftware.com)和Alachisoft(www.alachisoft.com)是两家著名的第三方软件厂商,致力于提供Web farm会话状态解决方案。这两家第三方软件厂商的产品均可以应用于高可用、高可伸缩性的Web farm系统,并且可以在进程内保存会话状态数据,同时支持立即复制所有的修改;此外,产品还支持在进程外保存会话数据,为了在进程外保存会话数据,需要使用运行在所有服务器中的自定义工作进程。

上一篇:使用System Sound Services 播放音效(最简单,比较底层),调用AudioServicesPlaySystemSound()


下一篇:wpf,离线状态下部分功能不可用。