MSDN: asp.net状态管理建议

状态管理是您对同一页或不同页的多个请求维护状态和页信息的过程。与所有基于 HTTP 的技术一样,Web 窗体页是无状态的,这意味着它们不自动指示序列中的请求是否全部来自相同的客户端,或者单个浏览器实例是否一直在查看页或站点。此外,到服务器的每一往返过程都将损坏并重新创建页;因此,如果超出了单个页的生命周期,页信息将不存在。有关服务器往返过程和 Web 窗体页生命周期的更多信息,请参见 Web 窗体页处理

ASP.NET 提供多种方式来在服务器往返过程之间维护状态。对 ASP.NET 中所提供的状态管理选项的选择将主要取决于您的应用程序,并且应基于以下条件:

  • 需要存储的信息量有多大?
  • 客户端是接受持久性的还是内存中的 Cookie?
  • 是要在客户端还是在服务器上存储信息?
  • 信息是否是敏感信息?
  • 您对应用程序设定了什么样的性能条件?

ASP.NET 支持用于状态管理的各种客户端和服务器端选项。

客户端选项有:

  • ViewState 属性
  • 隐藏域
  • Cookie
  • 查询字符串

服务器端选项有:

  • 应用程序状态
  • 会话状态
  • 数据库

客户端状态管理选项

使用客户端选项存储页信息不使用服务器资源。这些选项往往具有最低的安全性但具有最快的服务器性能,因为对服务器资源的要求是适度的。但是,由于必须将信息发送到客户端来进行存储,因此对于以这种方式可以存储多少信息存在一定的客观限制。

视图状态

Web 窗体页提供 ViewState 属性作为内置结构,在对同一页的多个请求间自动保留值。视图状态作为页中的隐藏域来进行维护。有关更多信息,请参见 Web 窗体状态管理介绍

可以使用视图状态在页回发到自身时跨越往返过程存储您自己的页特定值。例如,如果您的应用程序正在维护用户特定的信息(即,该信息在页上使用,但不是任何控件所必需的部分),则可以使用视图状态存储该信息。

使用视图状态的优点是:

  • 不需要任何服务器资源。视图状态包含在页代码内的结构中。
  • 简单的实现。
  • 页和控件状态的自动保持。
  • 增强的安全功能。视图状态中的值是散列的、压缩的并且是为 Unicode 实现而编码的,这意味着比隐藏域具有更高的安全性状态。

使用视图状态的缺点是:

  • 性能。由于视图状态存储在页本身,因此如果存储较大的值,在用户显示页和发送页时,页的速度就可能会减慢。
  • 安全性。视图状态存储在页上的隐藏域中。虽然视图状态以哈希格式存储数据,但它可以被篡改。如果直接查看页输出源,可以看到隐藏域中的信息,这导致潜在的安全性问题。有关更多信息,请参见介绍 Web 应用程序安全性

有关使用视图状态的更多信息,请参见使用视图状态保存 Web 窗体页值

隐藏域

可以在页上的隐藏域中存储特定于页的信息,作为维护页的状态的一种方式。有关隐藏域的更多信息,请参见 Web 窗体状态管理介绍

如果使用隐藏域,最好在客户端上只存储少量经常更改的数据。ASP.NET 提供 HtmlInputHidden 控件,该控件提供隐藏域功能。有关 HtmlInputHidden 的更多信息,请参见按功能列出的 ASP.NET 服务器控件

注意   如果使用隐藏域,则必须使用 HTTP POST 方法向服务器提交页,而不是使用通过页 URL 请求该页的方法(HTTP GET 方法)向服务器提交页。

使用隐藏域的优点是:

  • 不需要任何服务器资源。隐藏域在页上存储并读取。
  • 广泛的支持。几乎所有浏览器和客户端设备都支持具有隐藏域的窗体。
  • 简单的实现。

使用隐藏域的缺点是:

  • 安全性。隐藏域可以被篡改。如果直接查看页输出源,可以看到隐藏域中的信息,这导致潜在的安全性问题。有关更多信息,请参见介绍 Web 应用程序安全性
  • 有限的存储结构。隐藏域不支持丰富的结构。隐藏域提供在其中放置信息的单值域。若要存储多个值,必须实现分隔的字符串以及用来分析那些字符串的代码。
  • 性能。由于隐藏域存储在页本身,因此如果存储较大的值,在用户显示页和发送页时,页的速度就可能会减慢。

Cookie

Cookie 用于在客户端上存储少量经常更改的信息。这些信息与请求一起发送到服务器。

使用 Cookie 的优点是:

  • 不需要任何服务器资源。Cookie 存储在客户端并在发送后由服务器读取。
  • 简单。Cookie 是具有简单键值对的轻量的、基于文本的结构。
  • 可配置到期时间。Cookie 可以在浏览器会话结束时到期,或者可以在客户端计算机上无限期存在,这取决于客户端的到期规则。

使用 Cookie 的缺点是:

  • 大小受到限制。大多数浏览器对 Cookie 的大小有 4096 字节的限制,尽管在当今新的浏览器和客户端设备版本中,支持 8192 字节的 Cookie 大小已愈发常见。
  • 用户配置为拒绝接受。有些用户禁用了浏览器或客户端设备接收 Cookie 的能力,因此限制了这一功能。
  • 安全性。Cookie 可能会受到篡改。用户可能会操纵其计算机上的 Cookie,这可能意味着安全性会受到影响或者导致依赖于 Cookie 的应用程序失败。有关更多信息,请参见介绍 Web 应用程序安全性
  • 持久性。客户端计算机上 Cookie 的持久性受到客户端 Cookie 到期进程以及用户干预的制约。
    注意   Cookie 通常用于为已知用户自定义内容的个性化情况。在大多数此类情况中,Cookie 是作为“标识”而不是“身份验证”,所以在 Cookie 中只存储用户名、账户名或唯一用户 ID(例如 GUID)并使用它来访问站点的用户个性化结构是足够的了。

有关创建和读取 Cookie 的详细信息,请参见 HttpResponse.Cookies 属性HttpRequest.Cookies 属性

查询字符串

查询字符串是附加到页的 URL 末尾的信息。有关更多信息,请参见 Web 窗体状态管理介绍

可以使用查询字符串来通过 URL 将数据提交回您的页或另一页上。查询字符串提供一种维护某些状态信息的简单但有限的方法。例如,它们是将信息从一页传送到另一页的简便的方法(例如,将产品号传递到将处理该产品号的另一页)。

注意   只有在通过其 URL 请求页时查询字符串才是可行的选择。不能从已提交给服务器的页读取查询字符串。

使用查询字符串的优点是:

  • 不需要任何服务器资源。查询字符串包含在对特定 URL 的 HTTP 请求中。
  • 广泛的支持。几乎所有浏览器和客户端设备均支持传递查询字符串中的值。
  • 简单的实现。ASP.NET 完全支持查询字符串方法,包括使用 HttpRequest.Params 属性读取查询字符串的方法。

使用查询字符串的缺点是:

  • 安全性。用户可以通过浏览器用户界面直接看到查询字符串中的信息。查询值通过 URL 向 Internet 公开,因此在某些情况下安全性可能成问题。有关更多信息,请参见介绍 Web 应用程序安全性
  • 有限的容量。大多数浏览器和客户端设备对 URL 长度有 255 个字符的限制。

客户端方法状态管理摘要

下表总结了客户端状态管理选项和使用这些选项的场合。

方法 使用场合
视图状态 需要为将回发到自身的页存储少量信息。ViewState 属性的使用将提供具有基本安全性的功能。
隐藏域 需要为将回发到自身或另一页的页存储少量信息,并且不需要较高的安全性。
注意   只能在提交到服务器的页上使用隐藏域。
Cookie 需要在客户端存储少量信息并且不需要较高的安全性。
查询字符串 可以将少量信息从一页传输到另一页,并且不需要较高的安全性。
注意   只有在请求同一页,或通过链接请求另一页时,才能使用查询字符串。

服务器端状态管理选项

存储页信息的服务器端选项往往比客户端选项具有更高的安全性,但它们可能使用更多的 Web 服务器资源,这可能在信息存储量较大时导致可缩放性问题。ASP.NET 提供几种选项来实现服务器端状态管理。有关更多信息,请参见 Web 窗体状态管理介绍

应用程序状态

ASP.NET 通过 HttpApplicationState 类将应用程序状态提供为一种存储全局应用程序特定信息(对于整个应用程序都可见)的方法。应用程序状态变量实际上是 ASP.NET 应用程序的全局变量。有关更多信息,请参见应用程序状态

您可以在应用程序状态中存储应用程序特定的值,应用程序状态将由服务器来管理。有关更多信息,请参见 Web 窗体状态管理介绍

插入到应用程序状态变量的理想数据是那些由多个会话共享并且不经常更改的数据。

注意   如果以应用程序状态存储数据集,则必须将其从 Object 强制转换回数据集。有关详细信息,请参见 Web 数据访问策略建议

使用应用程序状态的优点是:

  • 易于实现。应用程序状态易于使用,为 ASP 开发人员所熟悉,并且与其他 .NET Framework 类一致。
  • 全局范围。由于应用程序状态可供应用程序中的所有页来访问,因此在应用程序状态中存储信息可能意味着仅保留信息的一个副本(例如,相对于在会话状态或在单独页中保存信息的多个副本)。

使用应用程序状态的缺点是:

  • 全局范围。应用程序状态的全局性可能也是一项缺点。在应用程序状态中存储的变量仅对于该应用程序正在其中运行的特定进程而言是全局的,并且每一应用程序进程可能具有不同的值。因此,不能依赖应用程序状态来存储唯一值或更新网络园和网络场配置中的全局计数器。
  • 持久性。因为在应用程序状态中存储的全局数据是易失的,所以如果包含这些数据的 Web 服务器进程被损坏(最有可能是因服务器崩溃、升级或关闭而损坏),将丢失这些数据。
  • 资源要求。应用程序状态需要服务器内存,这可能会影响服务器的性能以及应用程序的可缩放性。

应用程序状态的精心设计和实现可以提高 Web 应用程序性能。例如,如果将常用的、相关的静态数据集放置到应用程序状态中,则可以通过减少对数据库的数据请求总数来提高站点性能。但是,这里存在一种性能平衡。当服务器负载增加时,包含大块信息的应用程序状态变量就会降低 Web 服务器的性能。在移除或替换值之前,将不释放在应用程序状态中存储的变量所占用的内存。因此,最好只将应用程序状态变量用于更改不频繁的小型数据集。有关优化 ASP.NET Web 应用程序的更多信息,请参见 ASP.NET 优化

会话状态

ASP.NET 提供了一种会话状态,该会话状态可作为 HttpSessionState 类或存储会话特定信息(仅在该会话中可见)的方法来使用。有关更多信息,请参见 Web 窗体状态管理介绍会话状态

可以在会话状态中存储会话特定的值和对象,该会话状态对象将由服务器来进行管理并可用于浏览器或客户端设备。存储在会话状态变量中的理想数据是特定于单独会话的短期的、敏感的数据。

注意   如果以应用程序状态存储数据集,则必须将其从 Object 强制转换回数据集。请参见 Web 数据访问策略建议

使用会话状态的优点是:

  • 易于实现。会话状态功能易于使用,为 ASP 开发人员所熟悉,并且与其他 .NET Framework 类一致。
  • 会话特定的事件。会话管理事件可以由应用程序引发和使用。
  • 持久性。放置于会话状态变量中的数据可以经受得住 Internet 信息服务 (IIS) 重新启动和辅助进程重新启动,而不丢失会话数据,这是因为这些数据存储在另一个进程空间中。
  • 平台可缩放性。会话状态对象可在多计算机和多进程配置中使用,因而优化了可缩放性方案。
  • 尽管会话状态最常见的用途是与 Cookie 一起向 Web 应用程序提供用户标识功能,但会话状态可用于不支持 HTTP Cookie 的浏览器。有关独立于 Cookie 使用会话状态的更多信息,请参见 ASP.NET 配置节

有关更多信息,请参见会话状态

使用会话状态的缺点是:

  • 性能。会话状态变量在被移除或替换前保留在内存中,因而可能降低服务器性能。如果会话状态变量包含类似大型数据集的信息块,则可能会因服务器负荷的增加影响 Web 服务器的性能。

数据库支持

在某些情况中,您可能希望使用数据库支持来维护 Web 站点上的状态。通常,数据库支持与 Cookie 或会话状态结合在一起使用。例如,对于电子商务 Web 站点,出于以下原因使用关系数据库维护状态信息十分普遍:

  • 安全性
  • 个性化
  • 一致性
  • 数据挖掘

下面是支持 Cookie 的数据库 Web 站点的常见功能:

  • 安全性。访问者将账户名称和密码键入到站点登录页中。站点结构通过登录值查询数据库以确定该用户是否有权使用您的站点。如果数据库确认该用户信息有效,Web 站点将把包含该用户的唯一 ID 的有效 Cookie 分发到客户端计算机上。站点授予该用户访问权限。
  • 个性化。通过在适当位置的安全信息,您的站点能够借助读取客户端计算机上的 Cookie,区分站点上的每一用户。通常,站点在数据库中具有信息,描述用户的首选项(由唯一 ID 标识)。此关系通称作个性化。站点可以使用在 Cookie 中包含的唯一 ID 调查用户的首选项,然后向用户提供与用户的特定愿望相关并在一段时间内对用户首选项作出反应的内容和信息。
  • 一致性。如果您已创建了一个商业 Web 站点,您可能想要为站点上的货物和服务保留所进行的购买的交易记录。这些信息可被可靠地保存在您的数据库中并通过用户的唯一 ID 来引用。它可用于确定购买交易是否完成,还可确定如果购买交易失败所应采取的操作的过程。这些信息还可用于通知用户使用您的站点所下的订单的状态。
  • 数据挖掘。有关站点使用、访问者或产品交易的信息可以可靠地存储在数据库中。例如,业务发展部门可能希望使用从该站点收集的这些数据确定下一年的产品线或分销策略。市场营销部门可能希望查看有关您的站点的用户的人口统计学信息。设计和支持部门可能希望查看交易并记下购买过程可以改进的区域。诸如 Microsoft SQL Server 之类的大多数企业级关系数据库为大多数数据挖掘项目包含可扩展的工具集。

在上述方案中通过将 Web 站点设计为在每一一般性阶段使用唯一 ID 重复查询该数据库,该站点对状态进行维护。在此方法中,用户感受到站点正记住和响应其本人。

使用数据库来维护状态的优点是:

  • 安全性。对数据库的访问要求严格的身份验证和授权,这种访问通常非常安全。
  • 容量。可以根据需要在数据库中存储尽可能多的信息。
  • 持久性。可以根据需要在尽可能长的时间内存储数据库信息,这些信息不受 Web 服务器可用性的影响。
  • 可靠性和数据完整性。数据库包括多种用于维护有效的功能,其中包括触发器和引用完整性、事务等。通过在数据库中(而不是在会话状态等对象中)保存有关事务的信息,可以更为方便地从错误恢复。
  • 可访问性。存储在数据库中的数据可供多种信息处理工具访问。
  • 广泛支持。有大量数据库工具可供使用,并且有许多自定义配置可供使用。

使用数据库来维护状态的缺点是:

  • 复杂性。使用数据库支持状态管理意味着更复杂的硬件和软件配置。
  • 性能。不佳的关系数据模型结构可能导致扩展问题。此外,对数据库执行过多的查询可能会影响服务器性能。

服务器端方法状态管理摘要

下表总结了服务器端状态管理选项和使用这些选项的场合。

方法 使用场合
应用程序状态 您是在存储更改不频繁的全局信息,这些信息由多个用户使用,此时安全性不成为问题。不要在应用程序状态中存储大量的信息。
会话状态 存储特定于单独会话的短期信息,并且需要较高的安全性。不要在会话状态中存储大量的信息。知道将为应用程序中每一会话的生存期创建和维护会话状态对象。在支持许多用户的应用程序中,这可能会占用大量服务器资源并影响可缩放性。
数据库支持 存储大量信息,管理交易,或者信息必须可以经受得住应用程序和会话重新启动。数据挖掘十分重要,并且需要较高的安全性。

请参见

Web 窗体状态管理 | Web 窗体状态管理介绍 | Web 窗体编程 | 状态管理建议 | 使用视图状态保存 Web 窗体页值 | 开发高性能的 ASP.NET 应用程序

posted @ 2005-08-24 11:31  Ready!  阅读(476)  评论(0编辑  收藏  举报