ASP.NET服务器控件之视图状态
· 加密机制
使用加密来保护ViewState字段中的实际数据值。首先,必须如上所述设置EnableViewStatMAC="true"。然后,将machineKey validation类型设置为3DES,即<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="3DES" />,这指示ASP.NET使用3DES加密算法来加密ViewState值。
(4)视图状态分块
以上内容介绍了视图状态的一些基本知识。然而,可能部分读者会有些疑惑:如果在某些情况下,视图状态数据变得很大,那怎么办呢?这样显然会出现一些意想不到的后果。为此,ASP.NET 2.0新增了一种名为"视图状态分块"的功能。如果视图状态的数据量变得太大,视图状态分块自动将数据分成多个块区,并将这些数据放在多个隐藏形式的字段中。
若要启用视图状态分块,可将MaxPageStateFieldLength属性设置为在单个视图状态字段中允许的最大大小(以字节为单位)。当该页回发到服务器时,该页会在页初始化阶段分析视图状态字符串,并还原页中的属性信息。默认设置是-1,这表示不存在最大大小,不会将视图状态分成多个块区。
(5)优点和缺点
使用视图状态具有以下3个优点:一、耗费的服务器资源较少(与Application、Session相比)。因为,视图状态数据都写入了客户端计算机中。二、易于维护。默认情况下,.NET系统自动启用对控件状态数据的维护。三、增强的安全功能。视图状态中的值经过哈希计算和压缩,并且针对Unicode实现进行编码,其安全性要高于使用隐藏域。
使用视图状态具有以下3个缺点:一、性能注意事项。由于视图状态存储在页本身,因此如果存储较大的值,即使在视图状态分块的情况下,用户显示页和发送页时的速度仍然可能减慢。二、设备限制。移动设备可能没有足够的内存容量来存储大量的视图状态数据。因此,移动设备上的服务器控件时,将使用其他的实现方法。三、潜在的安全风险。视图状态存储在页上的一个或多个隐藏域中。虽然视图状态以哈希格式存储数据,但它可以被篡改。如果直接查看页输出源,可以看到隐藏域中的信息,这导致潜在的安全性问题。
典型应用
在利用ASP.NET 2.0技术进行服务器控件开发过程中,有很多方面可以用到视图状态。常见的是利用ViewState字典实现服务器控件属性。ViewState是System.Web.UI.StateBag类型-一个键/值对的字典,服务器控件的属性值可以存储在ViewState中。下面通过一个典型示例,说明ViewState的应用方法。
在自定义服务器控件LabelInViewState中,实现了两个属性Text和TextInViewState。前者使用私有变量创建,后者使用ViewState实现。它们都用于获取或者设置文本内容。自定义控件实现文件LabelInViewState.cs源代码如下所示。
使用加密来保护ViewState字段中的实际数据值。首先,必须如上所述设置EnableViewStatMAC="true"。然后,将machineKey validation类型设置为3DES,即<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="3DES" />,这指示ASP.NET使用3DES加密算法来加密ViewState值。
(4)视图状态分块
以上内容介绍了视图状态的一些基本知识。然而,可能部分读者会有些疑惑:如果在某些情况下,视图状态数据变得很大,那怎么办呢?这样显然会出现一些意想不到的后果。为此,ASP.NET 2.0新增了一种名为"视图状态分块"的功能。如果视图状态的数据量变得太大,视图状态分块自动将数据分成多个块区,并将这些数据放在多个隐藏形式的字段中。
若要启用视图状态分块,可将MaxPageStateFieldLength属性设置为在单个视图状态字段中允许的最大大小(以字节为单位)。当该页回发到服务器时,该页会在页初始化阶段分析视图状态字符串,并还原页中的属性信息。默认设置是-1,这表示不存在最大大小,不会将视图状态分成多个块区。
(5)优点和缺点
使用视图状态具有以下3个优点:一、耗费的服务器资源较少(与Application、Session相比)。因为,视图状态数据都写入了客户端计算机中。二、易于维护。默认情况下,.NET系统自动启用对控件状态数据的维护。三、增强的安全功能。视图状态中的值经过哈希计算和压缩,并且针对Unicode实现进行编码,其安全性要高于使用隐藏域。
使用视图状态具有以下3个缺点:一、性能注意事项。由于视图状态存储在页本身,因此如果存储较大的值,即使在视图状态分块的情况下,用户显示页和发送页时的速度仍然可能减慢。二、设备限制。移动设备可能没有足够的内存容量来存储大量的视图状态数据。因此,移动设备上的服务器控件时,将使用其他的实现方法。三、潜在的安全风险。视图状态存储在页上的一个或多个隐藏域中。虽然视图状态以哈希格式存储数据,但它可以被篡改。如果直接查看页输出源,可以看到隐藏域中的信息,这导致潜在的安全性问题。
典型应用
在利用ASP.NET 2.0技术进行服务器控件开发过程中,有很多方面可以用到视图状态。常见的是利用ViewState字典实现服务器控件属性。ViewState是System.Web.UI.StateBag类型-一个键/值对的字典,服务器控件的属性值可以存储在ViewState中。下面通过一个典型示例,说明ViewState的应用方法。
在自定义服务器控件LabelInViewState中,实现了两个属性Text和TextInViewState。前者使用私有变量创建,后者使用ViewState实现。它们都用于获取或者设置文本内容。自定义控件实现文件LabelInViewState.cs源代码如下所示。
using System;using System.Collections.Generic;
using System.ComponentModel;using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace WebControlLibrary...{
[DefaultProperty("Text")]
[ToolboxData("<{0}:LabelInViewState runat=server></{0}:LabelInViewState>")]
public class LabelInViewState : WebControl ...{
private string _text; //实现Text属性
public string Text ...{
get ...{
return (_text == null) ? string.Empty : _text;
}
set ...{ _text = value; }
}
//使用ViewState实现TextInViewState属性
public string TextInViewState ...{
get ...{
String s = (String)ViewState["TextInViewState"];
return ((s == null) ? String.Empty : s);
}
set ...{ ViewState["TextInViewState"] = value; }
}
// 重写RenderContents方法
protected override void RenderContents(HtmlTextWriter output) ...{
output.Write("Text = ");
output.Write(Text);
output.Write("<br/>");
output.Write("TextInViewState = ");
output.Write(TextInViewState);
}
}
}
0
相关文章
