您想了解的关于 ASP.NET 状态管理的所有信息






2.94/5 (18投票s)
2005年3月17日
8分钟阅读

83672
本文将重点介绍 ASP.NET 提供的状态管理机制,以及学习和理解它们对可用性、性能和可伸缩性的影响的步骤。
引言
正如我们大多数人所知,网页是无状态的,并且基于 HTTP,这意味着它不会自动指示一系列请求是否全部来自同一客户端,还是一个新客户端,甚至更糟的是,一个单独的浏览器实例是否仍在浏览该网站。每次客户端请求页面时,都会返回页面的新实例,并且在每次往返后页面都会被销毁。所以总而言之,默认情况下状态不会在客户端请求之间维护。
从大型购物网站到小型内网网站的应用程序都依赖于跟踪来自不同用户的单个请求并为每个用户存储状态的能力,例如,用户选择的一些偏好。从经典 ASP 的时代开始,就有各种可用的状态管理技术。ASP 使用 cookie、查询字符串、应用程序、会话等。ASP.NET 支持所有这些,以及一些更丰富、更简单、更强大的机制,可用于构建健壮的 Web 应用程序。ASP.NET 不仅大大简化了过程,还解决了经典 ASP Session 对象的一些问题,例如在 Web 场或 Web 园场景中使用 Sessions。
状态管理选项
广义上讲,有两种管理网页状态的方法。它可以是客户端的,也可以是服务器端的。这两种方法都取决于影响和要求。
首先,我们来看看客户端状态管理选项。
客户端状态管理:在客户端状态管理下,在往返之间服务器上不维护任何信息。信息将存储在页面或客户端的计算机上。
以下是维护客户端状态的各种方法
- Cookie
- 隐藏字段
- 视图状态
- 查询字符串
Cookies: Cookie 是存储在客户端文件系统中的文本文件或客户端浏览器会话的内存中的少量数据。Cookie 主要用于跟踪数据设置。虽然 Cookie 通常用于存储用户特定的配置信息和偏好设置,但它们可用于存储应用程序所需的任何客户端特定状态(只要该状态已转换为字符串格式)。一个例子可以是根据用户偏好自定义欢迎页面。
以下是 ASP.NET 中使用 Cookies 的示例
HttpCookie nameCookie= new HttpCookie("Name");
nameCookie.Value = TxtName.Text;
Response.Cookies.Add(nameCookie);
隐藏字段: 隐藏字段在浏览器中不可见,但您可以像设置标准控件一样设置其属性。当页面提交到服务器时,隐藏字段的内容会与表单中其他控件的值一起在 HTTP 表单集合中发送。ASP.NET 提供了 HtmlInputHidden
控件,可提供隐藏字段功能。
以下是 C# 中的代码示例
protected System.Web.UI.HtmlControls.HtmlInputHidden Hidden1;
//To set a value
Hidden1.Value=”Test Value assigned to hidden field”;
//to retrieve a value
string strValue=Hidden1.Value;
虽然它的名字是“隐藏”,但它的值并非隐藏;您可以通过浏览器中的“查看 -> 源代码”选项看到它的值。
View State: 除了会话状态和 Cookie 状态之外,ASP.NET 还引入了一种通过称为 View State 的机制存储客户端特定状态的能力。View State 存储在每个 ASP.NET 页面的一个名为 __VIEWSTATE
的隐藏字段中。每次页面回发到自身时,__VIEWSTATE
字段的内容都会作为回发的一部分发送。View State 的主要用途是使控件能够在回发之间保持其状态。
以下是 C# 中使用 ViewState 的示例
//to save information
ViewState.Add(“Test”,”ViewState Sample”);
//to retrieve information
string test=ViewState[“Test”];
查询字符串: 查询字符串提供了一种简单但有限的状态信息维护方式。您可以轻松地将信息从一个页面传递到另一个页面。但是,大多数浏览器和客户端设备对 URL 的长度都有限制,通常为 255 个字符。此外,查询值会通过 URL 暴露给 Internet,因此在某些情况下安全性可能是一个问题。带有查询字符串的 URL 可能看起来像这样:http://www.Himanshu.com/list.aspx?Age=27&Count=101。当请求 list.aspx 时,可以通过以下代码获取类别和产品信息
[c#] string Age, Count;
Age =Request.QueryString[“Age”];
Count =Request. QueryString [“Count”];
服务器端状态管理
在服务器端状态管理的情况下,信息将存储在服务器上,好处是安全性更高,但可能会消耗更多的 Web 服务器资源。服务器端状态管理可以再次分为两个子类:进程内状态管理和进程外状态管理。进程内状态管理涉及 Application 和 Session 对象,而进程外状态管理涉及将状态存储在 SQL Server 或 .NET 提供的 State Server 中。让我们逐一详细探讨。
进程内状态管理 配置进程内模式
进程内是默认的会话状态模式。要使用进程内模式,请将 <SESSIONSTATE>
元素的 mode 属性设置为 Inproc
。以下显示了进程内模式的示例配置设置
<configuration>
<system.web>
<sessionState mode="Inproc" cookieless="false timeout="20"/>
</sessionState>
</system.web>
</configuration>
Application 对象
Application 对象提供了一种存储数据的方法,该数据可供 Web 应用程序中运行的所有代码访问。对于应用程序全局的信息可以存储在应用程序对象中。为了提高效率,此状态通常存储一次,然后多次读取。程序员在使用 Application 变量之前应该考虑各种问题。程序员应该考虑在多线程服务器环境中存储和访问全局变量时的内存占用、并发和同步影响,以及 Application 级别变量的可伸缩性,因为它们不能跨 Web 场(应用程序由多个服务器托管)或 Web 园(应用程序由同一服务器上的多个进程托管)共享。
尽管存在这些问题,精心设计的应用程序级别变量在 Web 应用程序中可能非常强大。您可以执行一次(或不频繁)加载和计算信息,然后使用应用程序状态将其缓存,以便在后续的 Web 请求中进行快速的内存访问。
Session 对象
Session 对象可用于存储需要在服务器往返和页面请求之间维护的会话特定信息。Session 对象是按客户端基础的,这意味着不同的客户端生成不同的 Session 对象。存储在 Session 状态变量中的理想数据是短暂的、敏感的、特定于单个会话的数据。每个活动的 ASP.NET 会话都使用一个包含 URL 合法 ASCII 字符的 120 位 SessionID 字符串进行标识和跟踪。SessionID 值是使用确保唯一性的算法生成的,并且 SessionID 是随机生成的,这使得猜测现有会话的 SessionID 变得更加困难。根据配置设置,SessionID 通过 HTTP Cookie 或修改后的 URL 在客户端-服务器请求之间通信。
以下是 ASP.NET 中存储 Session 值的示例
//to store information Session[“UserName”]=”Himanshu”;
//to retrieve information myname=Session[“UserName”];
进程外存储 Session 状态
ASP.NET 引入了存储会话状态到进程外(out of process)的能力,这可以通过 ASP.NET 应用程序的 web.config 文件中的 sessionState
元素进行设置。默认位置是进程内,就像经典 ASP 一样。但是,如果 mode 属性设置为 StateServer
或 SqlServer
,ASP.NET 将负责将会话状态保存和恢复到另一个进程或 SQL Server 数据库的详细信息。这是合适的,因为可以构建 ASP.NET 应用程序以正常方式访问会话状态,然后通过更改配置文件中的 sessionState
模式,就可以在 Web 场环境中安全地部署相同的应用程序。
将状态存储在 SQL Server 数据库中
将会话状态存储在服务器进程外的一种广泛使用的选项是将其保存在 SQL Server 数据库中。ASP.NET 通过 web.config 文件中 sessionState
配置元素的 SQLServer
模式支持这一点。要使用此模式,您必须在将存储会话状态的数据库服务器上运行 InstallSqlState.sql 脚本。该脚本可以在 Microsoft.NET 的主目录中找到。运行脚本后,它会创建一个表,该表可以按会话 ID 存储客户端特定的状态,存储在 SQL Server 的 tempdb 中。ASP 状态表创建在 tempdb 数据库中,该数据库不是完全日志记录的数据库,从而提高了数据访问的速度。
以下是配置 web.config 文件以使用 SQL Server 的示例
<configuration>
<system.web>
<sessionState mode = "SQLServer"
"data source=192.168.1.103;user id=sa;password=" />
</sessionState>
</system.web>
</configuration>
数据库允许您在 Web 应用程序中存储大量与状态相关的信息。有时用户会使用唯一 ID 持续查询数据库,您可以将其保存在数据库中以供站点中的多个页面请求使用。
ASP.NET 状态服务
状态服务可以运行在与 Web 应用程序相同的计算机上,也可以运行在专用的服务器计算机上。.NET Framework 提供了 aspnet_state.exe,可以用作维护状态的服务。当您想要进程外会话状态管理但又不想在托管状态的计算机上安装 SQL Server 时,使用状态服务选项非常有用。
以下是配置 web.config 文件以使用 State Server 的示例
<configuration>
<system.web>
<sessionState mode="StateServer" stateConnectionString="10.1.1.29:23454"/>
</sessionState>
</system.web>
</configuration>
结论
在本文中,我试图全面概述 .NET 中提供的状态管理选项。尽管 ASP.NET 比 ASP 具有更多的功能和实用程序,可以使您更有效地管理页面状态,但开发人员应考虑使用它们的各种优缺点,并花一些时间来决定哪种最适合应用程序。以下是开发人员在做出任何选择之前应考虑的问题。
- 信息的重要性如何?
- 需要存储的信息量或数据量。
- 是否可以使用客户端的持久或内存 Cookie?
- 信息将存储在哪里,即客户端还是服务器。
考虑到所有这些,让我们尽力以最有效和最优雅的方式释放 ASP.NET 的强大功能。