background image

web Form 网页是基于 HTTP 的,它们没有状态,这意味着它们不知道所有的请求是

否来自同一台客户端计算机,网页是受到了破坏,以及是否得到了刷新,这样就可能造

 

 

成信息的丢失。 于是, 状态管理就成了开发网络应用程序的一个实实在在的问题。
   在 ASP 中能够通过 Cookie 

 

、查询字符串、 应用程序、会话(Session) 等轻易解决这些

问题。现在在 ASP.NET 环境中,我们依然可以使用这些功能,并且功能更加强大。
     

 

状态管理分为服务端和客户端两种情况,这里只是介绍服务端状态管理:

Application

 

对象不同的是, ASP.NET 的 Session 对象可以在 IIS 服务器或者工作进程

重新启动时恢复启动前的状态而不丢失其中的数据。这是因为存储在 Session 中的所以信
息都缺省的存储在一个作为 Windows 服务运行的状态服务器进程中。状态可以被序列化
并以二进制形式保存在内存中。程序员可以选择使用 Microsoft Sql server 数据库来存储
数据。

状态服务器服务和状态信息可以和 web 应用程序一起存在于同一台服务器上,也可

以保存到外部的状态服务器上。为了指定如何存储信息,程序员可以在 web.config 文件
中编写适当的配置。
      ASP.NET 会 话 状 态 模 块 在 Web.config 文 件 中 <System.web> 标 记 下 的
<Sessionstate> 标 记 的 mode 属 性 来 决 定 。 该 属 性 的 四 种 可 能 的 值 :
Off、Inproc、StateServer 和 SQLserver。
  
 1  Inproc 是缺省的设置

它允许 无 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.NET 进程,当 IIS 进程崩溃或者正常重

启时,保存在进程中的状态将丢失。

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

 

模式的缺点, ASP.NET 提供了两种进程外保存会话状态的方法。

 3 StateServer 会话管理
  将 mode 属性设为 StateServer,也就是将会话数据存储到单独的内存缓冲区中,再
由单独一台机器上运行的 Windows

服务来控制这个缓冲区。状态服务全称是 ASP.NET 

State   Service   ” ( aspnet_state.exe ) , 它 由 Web.config 文 件 中 的