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

2011-09-23 10:22:14曹守富
湖南广播电视大学学报 2011年1期
关键词:会话进程应用程序

曹守富

(湖南广播电视大学,湖南长沙 410004)

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

曹守富*

(湖南广播电视大学,湖南长沙 410004)

在开发和使用基于ASP.NET技术的B/S模式应用系统时,经常会遇到会话状态丢失的情况。产生这种情况的原因因系统环境或者应用程序配置的不同而不同。本文首先介绍ASP.NET中的会话,然后归纳会话丢失情况并分析原因,给出相应的解决策略。

会话状态;会话超时;会话丢失

一、ASP.NET 中的会话

ASP.NET应用程序的会话表示用户在与该站点连接期间发送的所有请求,会话状态是用户在会话期间生成和使用的持久性数据的集合。每个会话的状态都彼此独立,在用户会话结束时将不复存在。默认情况下,站点的会话状态保存时间是20分钟。ASP.NET内置了会话状态操作的对象,使用ASP.NET内置的会话对象,可以使我们做到:对从单个浏览器客户端到服务器上的应用程序会话的请求通过会话标识(Session ID)进行自动识别,将会话有效期内保存的数据存储在服务器上以供跨多个页面请求时使用。

二、单一Web服务器情况下的会话状态丢失

1.会话状态存储

ASP.NET中会话状态的保存方式可通过设置web.config文件中<sessionState>标记的属性进行设置,标记中的mode属性决定了会话的存储方式,主要有以下三种取值:

InProc(默认):会话状态以活动对象方式存储在ASP.NET进程(IIS5是 aspnet_wp.exe,而 IIS6是 w3wp.exe)中。配置代码如下:

StateServer:进程外存储,会话状态被序列化后存储到某一台计算机的内存中,需要在这台计算机上启动ASP.NET State Service服务。配置代码如下:

SQLServer:进程外存储,会话状态被序列化后存储在SQL Server数据库中。配置代码如下:

2.会话状态丢失原因及解决策略

图1

在单一Web服务器情况下,我们一般将会话存储方式设置为InProc。在这种设置方式下,会话状态存储在ASP.NET进程内,以下情况都会导致会话状态丢失。一是当杀毒软件扫描应用程序中的Web.config文件时会话状态会丢失,为避免这种情况,需要使杀病毒软件屏蔽扫描Web.config文件。二是Web.config文件或者应用程序生成后的DLL文件被修改时,应用程序会被重新加载,此时会话状态也会丢失。因此修改这两个文件应避免访问量高峰时间段。三是设置应用程序池内性能的最大web进程数大于1时将会启动多个进程处理用户的请求,由于不同进程间会话状态不能共享,而导致会话状态丢失。这种情况下会话状态存储方式就要选择StateServer或者SQLServer。四是<sessionState>标记中cookieless属性值设置为false,需要客户端浏览器启用Cookie(默认情况下是启用的),否则会话状态会丢失。五是修改配置,设置为不定时自动回收该工作者进程,比如设置为当超出占用现有物理内存60%后自动回收该进程。通过使用应用程序池,可以确保多个应用程序间互相隔离,保证由于一个Web应用程序的崩溃不会影响另外的Web应用程序。如图1所示,Test.htm页面采用框架结构。由于该框架集页面是HMTL页面,第一次被请求时不会获得任何会话信息,而其中包含的框架页1和框架页2两个ASPX页面会被单独请求,每个页面将会获得不同的Session ID,这样就导致了客户端获取的会话状态不一致而引起会话状态的丢失。解决这个问题的办法是采用图2所示的方法,将框架集页面转换为ASPX页面。

图2

三、Web Farm环境中的会话状态丢失

图3

在应用系统访问量大的情况下,采用Web Farm构架系统来实现负载均衡,如图3所示。域名px.hnrti.com绑定到220.168.40.191 和 220.168.40.191 两台 Web 服务器地址上,当用户在浏览器的地址栏输入px.hnrti.com时,域名将动态的解析到其中某一台Web服务器。此时,如果系统开发人员对会话状态未做任何配置,系统投入使用后,会话状态很容易丢失。丢失原因除了上述“单一Web服务器环境”外,还有Web Fram环境固有的。

我们假设应用程序中有这两个页面ListInfo.aspx和ViewInfo.aspx,在这两个页面中都要使用会话状态,在访问并发量的增大的情况下,同一用户请求ListInfo.aspx和ViewInfo.aspx页面时,两次解析到的服务器地址可能不同,默认情况下会话状态都是存储在本地服务器上,这样就会出现虽然一个服务器上存储了会话状态,但另外一个服务器没有存储的情况,此时使用的会话状态就会丢失。针对这种情况,根据存储方式不同我们可以采用以下解决策略:

将会话状态存储方式设置为StateServer,配置代码举例如下:

其中timeout指定了会话状态有效时间,单位是分钟,tcpip指定了会话存储的服务器IP地址和端口号。也就是我们将会话状态信息专门存储在某一台服务器上,在这种模式下,需要启用存储会话状态服务器上的“ASP.NET状态服务”,由这个服务维护会话状态,这样只有这台服务系统中的ASP.NET状态服务停止或者会话服务器与Web服务器网络断开,会话状态才会丢失。

将会话状态存储方式设置为SQLServer,配置代码举例如下:

其中sqlConnectionString是连接数据库的连接字符串。这样将会话状态就存储在了Sql Server数据库中,此时需要启动Sql Server服务器上的系统服务SQL Agent。

将会话状态存储方式设置为InProc。这是默认的会话状态存储方式,将会话状态存储在本地服务器上。此时,可以设置一个计数器,并编写页面重定向的引导程序,在引导程序中根据计数器的值去判断访问哪个服务器,在重定向时使用Web服务器的IP地址而不使用域名去访问站点,这样一个用户在会话期间访问的所有页面程序都会固定在同一个服务器上,而不会因并发量大时出现“交叉”访问的情况。

四、结束语

以上列出了在实际应用开发中常见的会话状态丢失情况及相应的解决策略。根据系统需求和运行环境配置的不同,开发者可根据相应的策略或者多种策略综合运用来防止会话状态意外丢失从而使系统运行的更稳定。

[1]荣耀,瞿静文.ASP.ENT 2.0实战起步[M].北京:机械工业出版社,2008.

[2]李彦.ASP.NET3.5系统开发精髓[M].北京:电子工业出版社,2009.

[3]科霍斯罗维.ASP.NET&IIS7高级编程[M].北京:清华大学出版社,2008.

[4]刘乃丽.asp.net2.0 网络开发详解[M].电子工业出版社,2008.

[5]苏贵洋.asp.net网络编程从基础到实践[M].电子工业出版社,2005.

Abstract:The session state drops out constantly in developing and using B/S model application system based on ASP.NET.The reasons differ because of the difference of system environment or application configuration.This paper first introduces the session in ASP.NET,then summarizes the drop - out situations and analyzes the reasons,and finally proposes some solutions.

Key words:session state,session timeout,session state drop -out

On the Session State Drop-out in the Application of ASP.NET and its Solutions

CAO Shou-fu

TP3

A

1009-5152(2011)01-0052-02

2010-10-25

曹守富(1981- ),男,湖南广播电视大学信息工程系助教。

猜你喜欢
会话进程应用程序
债券市场对外开放的进程与展望
中国外汇(2019年20期)2019-11-25 09:54:58
删除Win10中自带的应用程序
电脑报(2019年12期)2019-09-10 05:08:20
有意冒犯性言语的会话含义分析
汉语教材中的会话结构特征及其语用功能呈现——基于85个会话片段的个案研究
社会进程中的新闻学探寻
民主与科学(2014年3期)2014-02-28 11:23:03
冲突语的会话分析研究
我国高等教育改革进程与反思
教育与职业(2014年7期)2014-01-21 02:35:04
对外汉语课堂英语通用语的会话调整功能
Linux僵死进程的产生与避免
关闭应用程序更新提醒
电脑迷(2012年15期)2012-04-29 17:09:47