首页 > 编程 > .NET > 正文

ASP.NET技巧:Session丢失原因与解决方案小结

2024-07-10 13:08:37
字体:
来源:转载
供稿:网友

  win2003 server下的iis6默认设置下对每个运行在默认应用池中的工作者进程都会经过20多个小时后自动回收该进程,造成保存在该进程中的session丢失。

  因为session,application等数据默认保存在运行该web应用程序的工作者进程中,如果回收工作者进程,则会造成丢失。

  解决办法:

  修改配置,设置为不定时自动回收该工作者进程,比如设置为当超出占用现有物理内存60%后自动回收该进程。通过使用默认应用程序池,可以确保多个应用程序间互相隔离,保证由于一个应用程序的崩溃不会影响另外的web应用程序。还可以使一个独立的应用程序运行在一个指定的用户帐号特权之下。

  如果使用stateserver方式或者sql server数据库方式来保存session,则不受该设置的影响。

  可能的原因2:

  系统要运行在负载平衡的 web 场环境中,而系统配置文件web.config中的session状态却设置为inproc(即在本地存储会话状态),导至在用户访问量大时,session常经超时的情况。引起这个现象的原因主要是因为用户通过负载平衡ip来访问web应用系统,某段时候在某台服务器保存了session的会话状态,但在其它的web前端服务器中却没有保存session的会话状态,而随着并发量的增大,负载平衡会当作路由随时访问空闲的服务器,结果空闲的服务器并没有之前保存的session会话状态。

  解决办法:

  1.当您在负载平衡的 web 场环境中运行 asp.net web 应用程序时,一定要使用 sqlserver 或 stateserver 会话状态模式,在项目中我们基于性能考虑并没有选择sqlserver模式来存储session状态,而是选择一台sessionstateserver 服务器来用户的session会话状态。我们要在系统配置文件web.config中设置如下:

<sessionstate mode="stateserver" cookieless="false" timeout="240" stateconnectionstring="tcpip=192.168.0.1:42424" statenetworktimeout="14400" />

  还要添加一项

<machinekey validationkey="78ae3850338bfadce59d8ddf58c9e4518e7510149c46142d7aad7f1ad49d95d4" decryptionkey="5fc88dfc24ea123c" validation="sha1"/> 

  2. 我们同时还要在sessionstateserver 服务器中启动asp.net state service服务,具体设置:控制面板>>管理工具>>服务>>asp.net state service,把它设为自动启动即可。 

  3. 每台前端web服务的microsoft“internet 信息服务”(iis)设置

  要在 web 场中的不同 web 服务器间维护会话状态,microsoft“internet 信息服务”(iis) 配置数据库中 web 站点的应用程序路径(例如,/lm/w3svc/2)与 web 场中所有 web 服务器必须相同。大小写也必须相同,因为应用程序路径是区分大小写的。在一台 web 服务器上,承载 asp.net 应用程序的 web 站点的实例 id 可能是 2(其中应用程序路径是 /lm/w3svc/2)。在另一台 web 服务器上,web 站点的实例 id 可能是 3(其中应用程序路径是 /lm/w3svc/3)。因此,web 场中的 web 服务器之间的应用程序路径是不同的。我们必须使web 场web 站点的实例 id 相同即可。你可以在iis中把某一个web配置信息保存为一个文件,其他web 服务器的iis配置可以来自这一个文件。您如果想知道具体的设置请访问microsoft support网站。

中国最大的web开发资源网站及技术社区,
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表