Asp.NET状态管理

Asp.NET状态管理

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

1、客户端状态管理

由于必须将信息发送到客户端来进行存储,因此具有最低的安全性和较快的服务器性能,并且这种方式可以存储多少信息存在一定的客观限制。

1)视图状态

Asp.net窗体页提供ViewState属性作为内置结构,在对同一页的多个请求之间自动保留值,视图状态作为页中的隐藏域来进行维护。可以使用视图状态在页回发到自身时跨越往返过程存储自己的也的特定值。

使用视图状态的优点:

  • 不需要任何服务器资源:视图状态包含在页代码内的结构中。
  • 实现简单:视图状态无需使用任何自定义编程(默认情况下对控件启用状态数据的维护)。
  • 增强的安全功能:视图状态中的值经过哈希计算和压缩,并且针对Unicode实现进行编码,其安全性要高于使用隐藏域。

 

使用视图状态的缺点:

  • 性能注意事项:由于视图状态存储在页本身,因此如果存储较大的值,用户显示和发送页的速度会变慢。尤其是对移动设备,其带宽通常是有限的。
  • 设备限制:移动设备可能没有足够的内存容量来存储大量的视图状态数据。
  • 潜在的风险安全:视图状态存储在页上的一个或多个隐藏域中,虽然视图状态以哈希格式存储数据,但它是可以被篡改的。如果直接查看页输出源,可以看到隐藏域中的信息。

 

2)控件状态

    Asp.net页框架提供了ControlState属性作为在服务器往返过程中自定义控件数据的方法。与视图状态不同的是,控件状态不能被关闭,因此它提供了存储控件状态数据的更可靠方法。

    使用控件状态的优点:

  • 不需要任何服务器资源:默认情况下,控件状态存储在页上的隐藏域中。
  • 可靠性:因为控件状态不像视图状态那样可以关闭,控件状态是管理控件的状态的更可靠方法。
  • 通用性:可以编写自定义适配器来控制如何存储控件状态数据和控件状态数据的存储位置。

 

    使用控件状态的缺点:

  • 需要一些编程:虽然asp.net页框架为控件状态提供了基础,但是控件状态是一个自定义的状态保护机制,为了充分利用控件状态,必须编写代码来保存和加载控件状态。

 

3)隐藏字段

    可以在页上的隐藏域中存储特定于页的信息。如果使用隐藏域,最好在客户端上只存储少量经常更改的数据,并且必须使用HTTP POST方法向服务器提交页,而不是使用页URL请求的方法(HTTP GET)向服务器提交页。

    使用隐藏字段的优点:

  • 不需要任何服务器资源:隐藏域在页上存储和读取。
  • 广泛的支持:几乎所有浏览器和客户端设备都支持具有隐藏域的窗体。
  • 实现简单:隐藏域是标准的HTML控件,不需要复杂的编程逻辑。

 

    使用隐藏字段的缺点:

  • 潜在的安全风险:隐藏域可以被篡改,如果直接查看页输出源,可以看到隐藏域中的信息,可以手动的加密和解密隐藏域的内容,但这需要额外的编码和开销。
  • 简单的存储结构:隐藏域不支持复杂数据类型,隐藏域只提供一个字符串值域存放信息,若要存储过个值,必须实现分隔的字符串以及用来分析字符串的代码。如果需要将复杂数据类型存储到客户端上,请考虑使用视图状态(视图状态内置了序列化,并且将数据存储在隐藏域中)。
  • 性能注意事项:由于隐藏域存储在页本身,因此如果存储较大的值,显示和发布页时的速度会变慢。
  • 存储限制:如果隐藏域中的数据量过大,某些代理和防火墙将阻止对包含这些数据的也的访问。因为最大数量会随所采用的防火墙和代理的不同而不同,较大的隐藏域可能会出现偶发性问题。

      

4)Cookies

5)查询字符串

2、服务端状态管理

    

3、补充

    1)存储大量的数据项,可以考虑以下操作:

        

posted @ 2011-08-25 14:29  连风  阅读(252)  评论(0编辑  收藏  举报