每次将网页发送到服务器时,都会创建网页类的一个新实例。在传统的 Web 编程中,这通常意味着在每一次往返行程中,与该页及该页上的控件相关联的所有信息都会丢失。例如,如果用户将信息输入到文本框,该信息将在从浏览器或客户端设备到服务器的往返行程中丢失。
为了解决传统的 Web 编程的固有限制,ASP.NET 包括了几个选项,可帮助您按页保留数据和在整个应用程序范围内保留数据。这些功能如下所示:
-
视图状态
-
控件状态
-
隐藏域
-
Cookie
-
查询字符串
-
应用程序状态
-
会话状态
-
配置文件属性
视图状态、控件状态、隐藏域、Cookie 和查询字符串均会涉及以不同方式将数据存储到客户端上。而应用程序状态、会话状态和配置文件属性都将数据存储到服务器上的内存中。每个选项都有不同的优点和缺点,具体取决于相应的方案。
下面各节描述一些状态管理选项,这些选项涉及在页中或客户端计算机上存储信息。对于这些选项,在各往返行程间不会在服务器上维护任何信息。
视图状态
ViewState 属性提供一个字典对象,用于在对同一页的多个请求之间保留值。这是页用来在往返行程之间保留页和控件属性值的默认方法。
在处理页时,页和控件的当前状态会散列为一个字符串,并在页中保存为一个隐藏域或多个隐藏域(如果存储在 ViewState 属性中的数据量超过了 MaxPageStateFieldLength 属性中的指定值)。当将页回发到服务器时,页会在页初始化阶段分析视图状态字符串,并还原页中的属性信息。
也可以使用视图状态来存储值。有关使用视图状态的更多信息,请参见 ASP.NET 视图状态概述。有关何时应使用视图状态的建议,请参见 ASP.NET 状态管理建议。
控件状态
有时,为了让控件正常工作,您需要按顺序存储控件状态数据。例如,如果编写了一个自定义控件,其中使用了不同的选项卡来显示不同的信息。为了让自定义控件按预期的方式工作,该控件需要知道在往返行程之间选择了哪个选项卡。可以使用 ViewState 属性来实现这一目的,不过,开发人员可以在页级别关闭视图状态,从而使控件无法正常工作。为了解决此问题,ASP.NET 页框架在 ASP.NET 中公开了一项名为控件状态的功能。
ControlState 属性允许您保持特定于某个控件的属性信息,且不能像 ViewState 属性那样被关闭。
隐藏域
ASP.NET 允许您将信息存储在 HiddenField 控件中,此控件将呈现为一个标准的 HTML 隐藏域。隐藏域在浏览器中不以可见的形式呈现,但您可以就像对待标准控件一样设置其属性。当向服务器提交页时,隐藏域的内容将在 HTTP 窗体集合中随同其他控件的值一起发送。隐藏域可用作一个储存库,您可以将希望直接存储在页中的任何特定于页的信息放置到其中。
安全说明: |
---|
恶意用户可以很容易地查看和修改隐藏域的内容。请不要在隐藏域中存储任何敏感信息或保障应用程序正确运行的信息。有关更多信息,请参见 ASP.NET 状态管理建议。 |
HiddenField 控件在其 Value 属性中只存储一个变量,并且必须通过显式方式添加到页上。有关更多信息,请参见 HiddenField Web 服务器控件概述。
为了在页处理期间能够使用隐藏域的值,必须使用 HTTP POST 命令提交相应的页。如果在您使用隐藏域的同时,为了响应某个链接或 HTTP GET 命令而对页进行了相应处理,那么隐藏域将不可用。有关推荐的使用方法,请参见 ASP.NET 状态管理建议。
Cookie
Cookie 是一些少量的数据,这些数据或者存储在客户端文件系统的文本文件中,或者存储在客户端浏览器会话的内存中。Cookie 包含特定于站点的信息,这些信息是随页输出一起由服务器发送到客户端的。Cookie 可以是临时的(具有特定的过期时间和日期),也可以是永久的。
可以使用 Cookie 来存储有关特定客户端、会话或应用程序的信息。Cookie 保存在客户端设备上,当浏览器请求某页时,客户端会将 Cookie 中的信息连同请求信息一起发送。服务器可以读取 Cookie 并提取它的值。一项常见的用途是存储标记(可能已加密),以指示该用户已经在您的应用程序中进行了身份验证。
安全说明: |
---|
浏览器只能将数据发送回最初创建该 Cookie 的服务器。但是,恶意用户可通过多种方法访问 Cookie 并读取其中的内容。建议您不要将敏感信息(如用户名或密码)存储在 Cookie 中。您可以在 Cookie 中存储一个标识用户的标记,然后使用该标记在服务器上查找敏感信息。 |
有关使用 Cookie 的更多信息,请参见 Cookies 和 ASP.NET 状态管理建议。
查询字符串
查询字符串是在页 URL 的结尾附加的信息。下面是一个典型的查询字符串示例:
http://www.contoso.com/listwidgets.aspx?category=basic&price=100
在上面的 URL 路径中,查询字符串以问号 (?) 开始,并包含两个属性/值对:一个名为“category”,另一个名为“price”。
查询字符串提供了一种维护状态信息的方法,这种方法很简单,但有使用上的限制。例如,利用查询字符串可以很容易地将信息从一页传送到另一页。例如,将产品号从一页传送到将处理该产品号的另一页。但是,大多数浏览器和客户端设备会将 URL 的最大长度限制为 2083 个字符。
安全说明: |
---|
在查询字符串中传递的信息可能会被恶意用户篡改。不要依靠查询字符串来传递重要的或敏感的数据。此外,用户可以创建 URL 的书签或将 URL 发送给其他用户,从而将这些信息与 URL 一起传递。有关更多信息,请参见 ASP.NET 状态管理建议和如何:通过对字符串应用 HTML 编码在 Web 应用程序中防止脚本侵入。 |
若要在页处理期间可以使用查询字符串的值,必须使用 HTTP GET 命令提交页。也就是说,如果为了响应 HTTP POST 命令而对页进行了相应处理,则不能利用查询字符串。有关推荐的使用方法,请参见 ASP.NET 状态管理建议。
ASP.NET 为您提供了多种方法,用于维护服务器上的状态信息,而不是保持客户端上的信息。通过基于服务器的状态管理,为了保留状态,您可以减少发送给客户端的信息量,但它可能会使用服务器上高成本的资源。下面各节描述了三种基于服务器的状态管理功能:应用程序状态、会话状态及配置文件属性。
应用程序状态
ASP.NET 允许您使用应用程序状态来保存每个活动的 Web 应用程序的值,应用程序状态是 HttpApplicationState 类的一个实例。应用程序状态是一种全局存储机制,可从 Web 应用程序中的所有页面访问。因此,应用程序状态可用于存储需要在服务器往返行程之间及页请求之间维护的信息。有关更多信息,请参见 ASP.NET 应用程序状态概述。
应用程序状态存储在一个键/值字典中,在每次请求一个特定的 URL 期间就会创建这样一个字典。可以将特定于应用程序的信息添加到此结构以在页请求期间存储它。
一旦将应用程序特定的信息添加到应用程序状态中,服务器就会管理该对象。有关推荐的使用方法,请参见 ASP.NET 状态管理建议。
会话状态
ASP.NET 允许您使用会话状态保存每个活动的 Web 应用程序会话的值,会话状态是 HttpSessionState 类的一个实例。有关概述,请参见 ASP.NET 会话状态概述。
会话状态与应用程序状态相似,不同的只是会话状态的范围限于当前的浏览器会话。如果有不同的用户在使用您的应用程序,则每个用户会话都将有一个不同的会话状态。此外,如果同一用户在退出后又返回到应用程序,第二个用户会话的会话状态也会与第一个不同。
会话状态采用键/值字典形式的结构来存储特定于会话的信息,这些信息需要在服务器往返行程之间及页请求之间进行维护。有关更多信息,请参见 ASP.NET 会话状态概述。
可以使用会话状态来完成以下任务:
-
唯一标识浏览器或客户端设备请求,并将这些请求映射到服务器上的单独会话实例。
-
在服务器上存储特定于会话的数据,以用于同一个会话内的多个浏览器或客户端设备请求。
-
引发适当的会话管理事件。此外,可以利用这些事件编写应用程序代码。
一旦将应用程序特定的信息添加到会话状态中,服务器就会管理该对象。根据您指定的选项的不同,可以将会话信息存储在 Cookie 中、进程外服务器中或运行 Microsoft SQL Server 的计算机中。有关推荐的使用方法,请参见 ASP.NET 状态管理建议。
配置文件属性
ASP.NET 提供了一个称为配置文件属性的功能,可让您存储特定于用户的数据。此功能与会话状态类似,不同的是,在用户的会话过期时,配置文件数据不会丢失。配置文件属性功能使用 ASP.NET 配置文件,此配置文件以持久的格式存储,并与某个用户关联。ASP.NET 配置文件可让您轻松地管理用户信息,而无需创建和维护自己的数据库。此外,配置文件使用了一个强类型 API,您可以在应用程序中的任何位置访问该 API,从而使用用户信息。您可以在配置文件中存储任何类型的对象。ASP.NET 配置文件功能提供了一个通用存储系统,使您能够定义和维护几乎任何类型的数据,同时仍可用类型安全的方式使用数据。
若要使用配置文件属性,必须对配置文件提供程序进行配置。ASP.NET 包括一个 SqlProfileProvider 类,使您能够将配置文件数据存储到 SQL 数据库中,但您也可以创建自己的配置文件提供程序类,用于以自定义格式将配置文件数据存储到自定义存储机制,如 XML 文件或 Web 服务。
因为放置在配置文件属性中的数据没有存储到应用程序内存中,所以这些数据在 Internet 信息服务 (IIS) 重新启动或辅助进程重新启动后仍能得到保留,而不会丢失。此外,配置文件属性可以跨多个进程得到保持,例如在网络场或网络园中。有关更多信息,请参见 ASP.NET 配置文件属性概述。