浅谈.Net下的Session用法-

本文介绍了一个基于BS结构的WEB应用系统中Session丢失的问题及其解决方案。负载平衡环境下,因Session状态设置不当导致用户操作过程中出现超时现象。文章详细介绍了如何通过配置StateServer模式并调整系统设置来解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景
  在我参与的一个项目中,这个项目是基本BS结构的WEB应用系统,经常会出现在Session丢失的情况,即使用户在操作的过程中也会出现超时现象。

原因
  我们的系统要运行在负载平衡的 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网站:
http://support.microsoft.com/default.aspx?scid=kb;zh-cn;325056

将Session值储存于SQL Server中.
  一般情况下,我们喜欢使用Session储存我们的变量。Asp.Net提供了下面一些方法储存Session的值:
  InProc
  State Server
  SQL Server
  “InProc”表示我们使用传统ASP一样的方法储存Session的值,而且“State Server”则表示使用另外一台主机来储存Session的值。当然我们也能使用SQL Server储存值,我们这篇文章就专门用于讲解这种方法。

运行InstallSqlState.sql文件
  首先需要在Winnt/Microsoft.Net中找到InstallSqlState.sql文件,然后在SQL Server 中执行它。在我的机器中,它存在于E:/WINNT/Microsoft.NET/Framework/v1.0.2914/目录中。这个文件是微软自己提供的,里面有很全的SQL语句,修改你的web.config文件,指定Session的mode为SQL Server
  将web.config的sessionState部分改成:
  <sessionState mode="SQLServer" sqlConnectionString="data source=WIN2000;userid= sa;password=" cookieless= "false"timeout= "20" />

创建Asp.Net Web Forms
  1 现在所有的Session变量都储存在数据表中,而不是内存中了。你可打开ASPStateTempSessions表来查看这些Session数据了。

删除这些数据库和表
  如果你不喜欢这个数据储存方式,看得实在是不爽,那么你可以把这些表和数据库完全删除掉。这个也不要担心这种删除会影响数据库(因为害怕误删除一些数据),因为微软同样也得供给你们一个删除SQL 文件,名叫UnintallSQLState.sql。它与IntallSQLState.sql一样放在.Net的Config目录中。
  另:
  2 存储在Windows服务中  
  启动asp.net state service 服务(net start aspnet_state)  
    修改Web.config  
           <configuration>  
               <system.web>  
                     <sessionState mode= "StateServer"  
                         stateConnectionString=  "tcpip=127.0.0.1:42424  " />  
               </system.web>  
           </configuration>  
  3 存储在数据库中  
  在microsoft sql server query analyzer中运行installsqlstate.sql,这个文件在“C:/WINNT/Microsoft.NET/Framework/v1.1.4322”下面找  
  修改Web.config  
           <configuration>  
               <system.web>  
                     <sessionState mode= "SQLServer"  
                         sqlConnectionString= "server=127.0.0.1;UID=sa;PWD=secret" />  
               </system.web>  
           </configuration>  
  重启SQL server和SQL Server Agent服务.  
  可以用下面的SQL查询会话  
  select * from AspStateTempSessions

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值