ASP.NET提供了新的状态管理技术

ZDNet软件频道 时间:2003-04-15 作者:周靖 译 |  我要评论()
本文关键词:
现在,ASP.NET开发者拥有了丰富的工具,可在各种不同的级别上简单、高效地存储及获取状态信息。本文探讨了ASP.NET的状态管理机制。
本文译自Builder.com构建应用程序时,软件开发者必须关注的一个核心问题就是对状态信息的处理。在Web应用程序中,这个任务尤其困难。HTTP天生就是无状态协议,在不同请求之间,记不住关于一名用户的任何事情。

现在,ASP.NET开发者拥有了丰富的工具,可在各种不同的级别上简单、高效地存储及获取状态信息。本文探讨了ASP.NET的状态管理机制。

ASP的用户会话问题

由于HTTP无状态的本质,必须采用一种机制在不同用户请求之间保存应用程序状态。换言之,在多个请求之间,服务器必须能识别出同一名用户。经典的ASP提供一个Session对象来负责这个任务,但遗憾的是,那个实现存在两处重要缺陷。首先,用于标识会话的120位会话ID总是作为一个Cookie存储到浏览器中。所以一旦用户的安全策略禁用了Cookie,Session对象便无数据可用。

其次,和会话有关并通过会话ID来访问的数据必须存储到负责处理初始请求和启动会话的那个Web服务器上。所以,会话数据无法在Web farm环境中共享;在这种环境中,要由多个Web服务器处理来自多个客户的请求。虽可采用编程技术和系统软件(比如Windows 2000群集服务以及Application Center 2000)强迫一个客户端在每次请求时都访问同一个Web服务器(这称为“粘性IP”技术),但由此产生的开销和负载不平衡的现象也严重影响了扩展能力。

ASP.NET改进的模型提供了更多的选择

ASP.NET的会话实现弥补了这两方面的缺陷,它允许“无Cookie”的会话,以及在服务器之外存储会话数据。ASP.NET会话状态模块在Web.config文件中像下面这样配置:

<sessionState mode="InProc" cookieless="false" timeout="20" />

在这个例子中,mode属性设为InProc(默认值),表明会话状态要由ASP.NET存储到内存中,而且不用Cookie来传递会话ID。相反,会话ID要直接插入一个网页URL的查询字符串中。例如,采用InProc模式并建立一个会话之后,调用一个假想的ASP.NET网页时,需要采用下面这样的URL: 

http://my.website.com/(12mfju55vgblubjlwsi4dgjq)/education.aspx

圆括号中长长的字母、数字字符串就是会话ID。ASP.NET引擎从查询字符中提取会话ID,并将用户请求与特定会话联系起来。采取这种方式,不管Cookie还是隐藏表单字段都用不着了。所以,即使网页中没有使用表单,也能加入会话。


使用要适度
和从前的ASP一样,ASP.NET的会话状态管理是要产生开销的。所以,假如某个网页不需要访问Session对象,开发者应将那个页的Page预编译指令的EnableSessionState属性设为False。要为整个网站禁用会话状态,可在Web.config文件中将sessionState元素的mode属性设为Off。



百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134