ASP.NET状态管理

来源:互联网 发布:百度推广优化 编辑:程序博客网 时间:2024/05/02 05:04

ASP.NET状态管理

  • 基于客户端的状态管理
  • 基于服务器的状态管理
  • ASP.NET 2.0 状态管理的新增功能

基于客户端的状态管理
将数据存储在客户端上以保持状态信息。 

实现方式包括: 

  •  视图状态
  •  控件状态
  •  隐藏域
  •  Cookie
  • 查询字符串


视图状态
ViewState属性提供一个字典对象,用于在对同一页的多个请求之间保留值。这是页用来在往返行程之间保留页和控件属性值的默认方法。

在处理页时,页和控件的当前状态会散列为一个字符串,并在页中保存为一个隐藏域或多个隐藏域(如果存储在ViewState 属性中的数据量超过了MaxPageStateFieldLength 属性中的指定值)。当将页回发到服务器时,页会在页初始化阶段分析视图状态字符串,并还原页中的属性信息。

使用视图状态的优点
 不需要任何服务器资源视图状态包含在页代码内的结构中。 实现简单视图状态无需使用任何自定义编程。默认情况下对控件启用状态数据的维护。
 增强的安全功能视图状态中的值经过哈希计算和压缩,并且针对Unicode 实现进行编码,其安全性要高于使用隐藏域。
使用视图状态的缺点
 性能注意事项由于视图状态存储在页本身,因此如果存储较大的值,用户显示页和发送页时的速度可能会减慢。尤其是对移动设备,其带宽通常是有限的。
 设备限制移动设备可能没有足够的内存容量来存储大量的视图状态数据。
 潜在的安全风险视图状态存储在页上的一个或多个隐藏域中。虽然视图状态以哈希格式存储数据,但它可以被篡改。如果直接查看页输出源,可以看到隐藏域中的信息,这导致潜在的安全性问题。


控件状态
• 有时,为了让控件正常工作,您需要按顺序存储控件状态数据。例如,如果编写了一个自定义控件,其中使用了不同的选项卡来显示不同的信息。为了让自定义控件按预期的方式工作,该控件需要知道在往返行程之间选择了哪个选项卡。可以使用ViewState 属性来实现这一目的,不过,开发人员可以在页级别关闭视图状态,从而使控件无法正常工作。为了解决此问题,ASP.NET 页框架在ASP.NET 中公开了一项名为控件状态的功能。
• ControlState 属性允许您保持特定于某个控件的属性信息,且不能像ViewState 属性那样被关闭。

使用控件状态的优点
 不需要任何服务器资源默认情况下,控件状态存储在页上的隐藏域中。
 可靠性因为控件状态不像视图状态那样可以关闭,控件状态是管理控件的状态的更可靠方法。
 通用性可以编写自定义适配器来控制如何存储控件状态数据和控件状态数据的存储位置。
使用控件状态的缺点
 需要一些编程虽然ASP.NET 页框架为控件状态提供了基础,但是控件状态是一个自定义的状态保持机制。为了充分利用控件状态,您必须编写代码来保存和加载控件状态。

隐藏域
• ASP.NET 允许您将信息存储在HiddenField 控件中,此控件将呈现为一个标准的HTML 隐藏域。隐藏域在浏览器中不以可见的形式呈现,但您可以就像对待标准控件一样设置其属性。当向服务器提交页时,隐藏域的内容将在HTTP 窗体集合中随同其他控件的值一起发送。隐藏域可用作一个储存库,您可以将希望直接存储在页中的任何特定于页的信息放置到其中。
• 必须使用HTTP POST 命令提交相应的页


使用隐藏域的优点
 不需要任何服务器资源隐藏域在页上存储和读取。
 广泛的支持几乎所有浏览器和客户端设备都支持具有隐藏域的窗体。
 实现简单隐藏域是标准的HTML 控件,不需要复杂的编程逻辑。
使用隐藏域的缺点
 潜在的安全风险隐藏域可以被篡改。如果直接查看页输出源,可以看到隐藏域中的信息,这导致潜在的安全性问题。您可以手动加密和解密隐藏域的内容,但这需要额外的编码和开销。
 简单的存储结构隐藏域不支持复杂数据类型。隐藏域只提供一个字符串值域存放信息。若要存储多个值,必须实现分隔的字符串以及用来分析那些字符串的代码。您可以手动分别将复杂数据类型序列化为隐藏域以及将隐藏域反序列化为复杂数据类型。但是,这需要额外的代码来实现。如果您需要将复杂数据类型存储在客户端上,请考虑使用视图状态。视图状态内置了序列化,并且将数据存储在隐藏域中。 性能注意事项由于隐藏域存储在页本身,因此如果存储较大的值,用户显示页和发送页时的速度可能会减慢。
 存储限制如果隐藏域中的数据量过大,某些代理和防火墙将阻止对包含这些数据的页的访问。因为最大数量会随所采用的防火墙和代理的不同而不同,较大的隐藏域可能会出现偶发性问题。如果您需要存储大量的数据项,请考虑执行下列操作之一:
• 将每个项放置在单独的隐藏域中。
• 使用视图状态并打开视图状态分块,这样会自动将数据分割到多个隐藏域。
• 不将数据存储在客户端上,将数据保留在服务器上。向客户端发送的数据越多,您的应用
程序的表面响应时间越慢,因为浏览器需要下载或发送更多的数据。


Cookie
• Cookie 是一些少量的数据,这些数据或者存储在客户端文件系统的文本文件中,或者存储在客户端浏览器会话的内存中。Cookie 包含特定于站点的信息,这些信息是随页输出一起由服务器发送到客户端的。Cookie 可以是临时的(具有特定的过期时间和日期),也可以是永久的。
• 可以使用Cookie 来存储有关特定客户端、会话或应用程序的信息。Cookie 保存在客户端设备上,当浏览器请求某页时,客户端会将Cookie 中的信息连同请求信息一起发送。服务器可以读取Cookie 并提取它的值。一项常见的用途是存储标记(可能已加密),以指示该用户已经在您的应用程序中进行了身份验证。

使用Cookie 的优点
 可配置到期规则Cookie 可以在浏览器会话结束时到期,或者可以在客户端计算机上无限期存在,这取决于客户端的到期规则。
 不需要任何服务器资源Cookie 存储在客户端并在发送后由服务器读取。
 简单性Cookie 是一种基于文本的轻量结构,包含简单的键值对。
 数据持久性虽然客户端计算机上Cookie 的持续时间取决于客户端上的Cookie过期处理和用户干预,Cookie 通常是客户端上持续时间最长的数据保留形式。
使用Cookie 的缺点
 大小受到限制大多数浏览器对Cookie 的大小有4096 字节的限制,尽管在当今新的浏览器和客户端设备版本中,支持8192 字节的Cookie 大小已愈发常见。
 用户配置为禁用有些用户禁用了浏览器或客户端设备接收Cookie 的能力,因此限制了这一功能。
 潜在的安全风险Cookie 可能会被篡改。用户可能会操纵其计算机上的Cookie,这意味着会对安全性造成潜在风险或者导致依赖于Cookie 的应用程序失败。另外,虽然Cookie 只能被将它们发送到客户端的域访问,历史上黑客已经发现从用户计算机上的其他域访问Cookie 的方法。您可以手动加密和解密Cookie,但这需要额外的编码,并且因为加密和解密需要耗费一定的时间而影响应用程序的性能。


查询字符串
• 查询字符串是在页URL 的结尾附加的信息。
http://www.contoso.com/listwidgets.aspx?category=basic&price=100
• 查询字符串提供了一种维护状态信息的方法,这种方法很简单,但有使用上的限制。例如,利用查询字符串可以很容易地将信息从一页传送到另一页。例如,将产品号从一页传送到将处理该产品号的另一页。但是,大多数浏览器和客户端设备会将URL 的最大长度限制为2083 个字符。
• 若要在页处理期间可以使用查询字符串的值,必须使用HTTP GET 命令提交页。


使用查询字符串的优点
 不需要任何服务器资源查询字符串包含在对特定URL 的HTTP 请求中。
 广泛的支持几乎所有的浏览器和客户端设备均支持使用查询字符串传递值。
 实现简单ASP.NET 完全支持查询字符串方法,其中包含了使用HttpRequest 对象的Params 属性读取查询字符串的方法。
使用查询字符串的缺点
 潜在的安全性风险用户可以通过浏览器用户界面直接看到查询字符串中的信息。用户可将此URL 设置为书签或发送给别的用户,从而通过此URL 传递查询字符串中的信息。如果您担心查询字符串中的任何敏感数据,请考虑使用窗体(使用POST 而不是查询字符串)中的隐藏域。
 有限的容量有些浏览器和客户端设备对URL 的长度有2083 个字符的限制。


基于客户端的状态管理的建议

  • 视图状态: 当您需要存储少量回发到自身的页信息时使用。使用ViewState 属性可提供具有基本安全性的功能。
  • 控件状态 当您需要在服务器的往返过程间存储少量控件状态信息时使用。
  • 隐藏域 当您需要存储少量回发到自身或另一页的页信息时使用,也可以在不存在安全性问题时使用。 注意:只能在提交到服务器的页上使用隐藏域。
  • Cookie 当您需要在客户端存储少量信息以及不存在安全性问题时使用。
  • 查询字符串 当您将少量信息从一页传输到另一页以及不存在安全性问题时使用。
     注意:只有在请求同一页,或通过链接请求另一页时,才能使用查询字符
    串。

 
基于服务器的状态管理
ASP.NET 为您提供了多种方法,用于维护服务器上的状态信息,而不是保持客户端上的信息。通过基于服务器的状态管理,为了保留状态,您可以减少发送给客户端的信息量,但它可能会使用服务器上高成本的资源。
包括以下四种实现方式:

  • 应用程序状态
  • 会话状态
  • 配置文件属性
  • 数据库支持

应用程序状态

ASP.NET 允许您使用应用程序状态来保存每个活动的Web 应用程序的值,应用程序状态是HttpApplicationState 类的一个实例。应用程序状态是一种全局存储机制,可从Web 应用程序中的所有页面访问。因此,应用程序状态可用于存储需要在服务器往返行程之间及页请求之间维护的信息。
• 例如:如果你想计算网站的在线人数,那么可以将这个计数器变量保存在应用程序状态中。

使用应用程序状态的优点
 实现简单应用程序状态易于使用,为ASP 开发人员所熟悉,并且与其他.NET Framework 类一致。
 应用程序范围由于应用程序状态可供应用程序中的所有页来访问
使用应用程序状态的缺点
 应用程序范围应用程序状态的范围可能也是一项缺点。在应用程序状态中存储的变量仅对于该应用程序正在其中运行的特定进程而言是全局的,并且每一应用程序进程可能具有不同的值。因此,不能依赖应用程序状态来存储唯一值或更新Web 场和Web园服务器配置中的全局计数器。
 数据持续性有限因为在应用程序状态中存储的全局数据是易失的,所以如果包含这些数据的Web 服务器进程被损坏(如因服务器崩溃、升级或关闭而损坏),将丢失这些数据。
 资源要求应用程序状态需要服务器内存,这可能会影响服务器的性能以及应用程序的可伸缩性。

会话状态
 ASP.NET 允许您使用会话状态保存每个活动的Web 应用程序会话的值,会话状态是HttpSessionState 类的一个实例。
会话状态与应用程序状态相似,不同的只是会话状态的范围限于当前的浏览器会话。如果有不同的用户在使用您的应用程序,则每个用户会话都将有一个不同的会话状态。此外,如果同一用户在退出后又返回到应用程序,第二个用户会话的会话状态也会与第一个不同。
可以使用会话状态来完成以下任务:
 唯一标识浏览器或客户端设备请求,并将这些请求映射到服务器上的单独会话实例。
 在服务器上存储特定于会话的数据,以用于同一个会话内的多个浏览器或客户端设备请求。
 引发适当的会话管理事件。此外,可以利用这些事件编写应用程序代码。

使用会话状态的优点
 实现简单会话状态功能易于使用,为ASP 开发人员所熟悉,并且与其他.NETFramework 类一致。
 会话特定的事件会话管理事件可以由应用程序引发和使用。
 数据持久性放置于会话状态变量中的数据可以经受得住Internet 信息服务(IIS) 重新启动和辅助进程重新启动,而不丢失会话数据,这是因为这些数据存储在另一个进程空间中。此外,会话状态数据可跨多进程保持(例如在Web 场或Web 园中)。
 平台可伸缩性会话状态可在多计算机和多进程配置中使用,因而优化了可伸缩性方案。
 无需Cookie 支持尽管会话状态最常见的用途是与Cookie 一起向Web 应用程序提供用户标识功能,但会话状态可用于不支持HTTP Cookie 的浏览器。但是,使用无Cookie 的会话状态需要将会话标识符放置在查询字符串中
 可扩展性您可通过编写自己的会话状态提供程序自定义和扩展会话状态。然后可以通过多种数据存储机制(例如数据库、XML 文件甚至Web 服务)将会话状态数据以自定义数据格式存储。
使用会话状态的缺点
 性能注意事项会话状态变量在被移除或替换前保留在内存中,因而可能降低服务器性能。如果会话状态变量包含诸如大型数据集之类的信息块,则可能会因服务器负荷的增加影响Web 服务器的性能。


配置文件属性
ASP.NET 提供了一个称为配置文件属性的功能,可让您存储特定于用户的数据。此功能与会话状态类似,不同的是,在用户的会话过期时,配置文件数据不会丢失。配置文件属性功能使用ASP.NET 配置文件,此配置文件以持久的格式存储,并与某个用户关联。


因为放置在配置文件属性中的数据没有存储到应用程序内存中,所以这些数据在Internet 信息服务(IIS) 重新启动或辅助进程重新启动后仍能得到保留,而不会丢失。此外,配置文件属性可以跨多个进程得到保持,例如在网络场或网络园中。

使用配置文件属性的优点
 数据持久性放置在配置文件属性中的数据在IIS 和辅助进程重新启动过程中得以保留而不会丢失数据,因为数据存储在一个外部机制中。此外,配置文件属性可跨多进程保持(例如在Web 场或Web 园中)。
 平台可伸缩性配置文件属性可在多计算机和多进程配置中使用,因而优化了可伸缩性方案。
 可扩展性为了使用配置文件属性,您必须对配置文件提供程序进行配置。ASP.NET 提供了一个SqlProfileProvider 类,使您可以将配置文件数据存储在SQL数据库中,但您也可以创建自己的配置文件提供程序类将配置文件数据按自定义格式存储到自定义存储机制中,例如XML 文件甚至Web 服务。
使用配置文件属性的缺点
 性能注意事项配置文件属性通常比使用会话状态慢,因为前者将数据持久保存到数据存储设备而非内存中。
 额外的配置要求与会话状态不同,配置文件属性功能需要使用相当数量的配置。若要使用配置文件属性,您不仅要对配置文件提供程序进行配置,还要预先配置您想要存储的所有配置文件属性。
 数据维护配置文件属性需要一定的维护。因为配置文件数据持久保存到存储设备中,所以必须确保在数据陈旧时,应用程序调用由配置文件提供程序提供的相应清理机制。


数据库支持
在某些情况中,您可能希望使用数据库支持来维护网站上的状态。通常,数据库支持与Cookie 或会话状态结合在一起使用。
例如,对于电子商务网站,普遍使用关系数据库维护状态信息,
其原因是: 安全性   个性化   一致性  数据挖掘

使用数据库维护状态的优点
 安全性访问数据库需要严格的身份验证和授权。
 存储容量可以根据需要在数据库中存储尽可能多的信息。
 数据持久性可以根据需要在尽可能长的时间内存储数据库信息,这些信息不受Web 服务器可用性的影响。
 可靠性和数据完整性数据库包括多种用于维护有效数据的功能,其中包括触发器和引用完整性、事务等。通过在数据库中(而不是在会话状态等对象中)保存有关事务的信息,可以更为方便地从错误恢复。
 可访问性存储在数据库中的数据可供众多的信息处理工具访问。
 广泛的支持有大量数据库工具可供使用,并且有许多自定义配置可供使用。
使用数据库维护状态的缺点
 复杂性使用数据库支持状态管理需要更复杂的硬件和软件配置。
 性能注意事项不佳的关系数据模型结构可能导致可伸缩性问题。此外,对数据库执行过多的查询可能会影响服务器性能。

基于服务器的状态管理的建议
 应用程序状态
 可在以下情况下使用:存储由多个用户使用且更改不频繁的全局信息,而且不存在安全性问题。不要在应用程序状态中存储大量的信息。
会话状态
 可在以下情况下使用:存储特定于单独会话的短期信息,并且需要较高的安全性。不要在会话状态中存储大量的信息。需要注意,将为应用程序中每一会话的生存期创建并维护会话状态对象。在支持许多用户的应用程序中,这可能会占用大量服务器资源并影响可缩放性。
配置文件属性
 可在以下情况下使用:存储需要在用户会话过期后保留、并在对应用程序的后续访问中需要再次检索的特定于用户的信息。
数据库支持
 可在以下情况下使用:存储大量信息,管理交易,或者信息必须可以经受得住应用程序和会话重新启动。数据挖掘十分重要,并且需要较高的安全性。

ASP.NET 2.0状态管理的新增功能
控件状态
 为了让控件正常工作,有时需要存储控件状态数据。例如,如果编写了一个自定义控件,其中具有显示不同信息的不同选项卡,为使该控件如预期一样工作,控件需要知道在往返过程中选择的是哪个选项卡。ViewState 属性可用于此目的,但开发人员可能在页级别关闭了视图状态,从而有效地中断控件。为解决此问题,ASP.NET 页框架在ASP.NET 2.0 版中公开了一种称为控件状态的新功能。
 ControlState 属性允许保持特定于控件的属性信息,不像ViewState 属性一样可以关闭。若要使用控件状态,控件必须在初始化过程中调用RegisterRequiresControlState 方法,然后重写SaveControlState 和LoadControlState 方法。

视图状态分块
 视图状态提供了一种简单的方法来自动保持页上的字段和控件数据,而不需要在往返服务器期间手动请求并重新填充。它还允许在ViewState 属性中存储页上的自定义数据。
 但是,在某些情况下,视图状态数据会变得很大。因为视图数据存储在隐藏的字段中,某些代理或防火墙会阻止对包含这些数据的页的访问。因此,ASP.NET 2.0 页框架引入了一种名为视图状态分块的功能。如果视图状态的数据量变得太大,视图状态分块自动将数据分成多个块区,并将这些数据放在多个隐藏形式的字段中。
 若要启用视图状态分块,请将MaxPageStateFieldLength 属性设置为在单个视图状态字段中允许的最大大小(以字节为单位)。当该页回发到服务器时,该页会在页初始化阶段分析视图状态字符串,并还原页中的属性信息。默认设置是-1,这表示不存在最大大小,不会将视图状态分成多个块区。