2.7 使用Asp.net客户端缓存和状态
你还可以使用客户端存储页面信息的方式来降低服务器的负担,这种方法提供最低的安全保障,但却有最快的性能表现。由于需要将数据发送到客户端存储,所以数据量有限。
实现客户端缓存的机制有以下五种,接下来将依次介绍:
·隐藏栏位(Hidden Field)
·View State
·隐藏帧(Hidden Frame)
·Cookies
·Query String
这五种方式分别适合于存储不同类型的数据。
2.7.1 使用Hidden Field
你可以将经常改变的少量数据保存在HtmlInputHidden中来维护页面的状态。当每次页面回送的过程中,这些数据都会包含在表单中大送到服务器,所以你要使用HTTP POST方式来提交页面。
使用这种方式的优点如下:
- 不需要服务器资源,直接从页面中读取;
- 几乎所有的浏览器都支持;
- 实现简单;
- 由于数据在页面中,所以在web Farm的情况下也可使用。
缺点:
- 由于可以通过查看源码看到,所以可能会被篡改;
- 不支持复杂格式的数据,复杂数据必须使用解析字符串的方式来间接得到;
- 当存储大数据的时候会影响性能。
示例:
<input id="HiddenValue" type="hidden" value="Initial Value" runat="server" NAME="HiddenValue">
2.7.2 使用View State
所有的Web Form页面和控件都包含有一个ViewState属性,在对同一页面多次请求时可以保持页面内的值。它的内部实现是维护相应的hidden field,只不过是加密了的,所以比hidden field的安全性要好。
使用View State的性能表现很大程度上依赖于服务器控件的类型。一般来说,Label,TextBox,CheckBox,RadioButton,HyperLink的性能要好一些,而DropdownList,ListBox,DataGrid和DataList就要差很多,因为包含的数据量太大,所以每次页面回送都很耗时间。
有些情况下不推荐使用ViewState,比如:
1、 不需要回送的页面避免使用;
2、 避免使用ViewState保存大数据量;
3、 在需要使用会话超时的情况下避免使用它,因为它没有超时操作。
ViewState的性能表现和Hidden Field的是类似的,但是具有更高的安全性。
优点:
- 数据在页面中自动维护,不需要服务器资源;
- 实现简单;
- 数据是经过加密和压缩的,比hidden field有更高的安全性;
- 数据存在客户端,可以在Web Farm情况下使用。
缺点:
- 存储大数据量时会降低性能;
- 和hidden field类似,在客户端数据仍然有潜在的安全威胁。
示例代码如下:
public class ViewStateSample : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack)
{
// Save some data in the ViewState property.
this.ViewState["EnterTime"] = DateTime.Now.ToString();
this.ViewState["UserName"] = "John Smith";
this.ViewState["Country"] = "USA";
}
}
…
private void btnRefresh_Click(object sender, System.EventArgs e)
{
// Get the saved data in the view state and display it.
this.lblTime.Text = this.ViewState["EnterTime"].ToString();
this.lblUserName.Text = this.ViewState["UserName"].ToString();
this.lblCountry.Text = this.ViewState["Country"].ToString();
}
}
2.7.3 使用Hidden Frame
你可以使用Hidden Frame在客户端缓存数据,这就避免了使用hidden field和使用view state时每次页面回送时的缓存数据往返。比如你可以秘密的加载多个页面所需要的图片,这并不会消耗服务器资源。
优点:
a. 可以加载较多数据而不只是单个栏位的值;
b. 避免了不必要的多次回送中的数据往来;
c. 可以缓存和读取在不同表单中存储的数据项(可以同时缓存多个页面的数据);
d. 可以访问同一站点不同frame中的客户端脚本数据。
缺点:
a. 有些浏览器不支持frame;
b. 源代码可以在客户端看到,有潜在的安全威胁;
c. 隐藏frame的数量没有限制,如果框架页面包含较多hidden frame的话,在首次加载时速度会有限制。
示例代码如下:
<FRAMESET cols="100%,*">
<FRAMESET rows="100%,*">
<FRAME src="contents_of_frame1.html">
</FRAMESET>
<FRAME src="contents_of_hidden_frame.html">
<FRAME src="contents_of_hidden_frame.html" frameborder="0" noresize scrolling="yes">
<NOFRAMES>
<P>This frameset document contains:
<A href="contents_of_frame1.html" TARGET="_top">Some neat contents</A>
</NOFRAMES>
</FRAMESET>
2.7.4 使用Cookies
Cookie是可以在客户端存储数据另一种方案,这里不过多介绍。
优点:
- 不需要服务器资源;数据保存在客户端,在用户请求时发送到服务器上。
- 使用简单。Cookie包含简单的键值对,主要保存轻量级的文本数据。
- 支持过期策略;可以指定当会话结束时过期,也可指定一个时间策略。
缺点:
- 数据量的限制;
- 用户可能设置为拒绝Cookie;
- 安全问题;用户可能更改机器上的cookie信息,造成基于cookie的系统运行失败;
- 可能过期或被用户删除,造成一定程度的不可用。
参看示例代码:
public class CookiesSample : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
if (this.Request.Cookies["preferences1"] == null)
{
HttpCookie cookie = new HttpCookie("preferences1");
cookie.Values.Add("ForeColor","black");
cookie.Values.Add("BackColor","beige");
cookie.Values.Add("FontSize","8pt");
cookie.Values.Add("FontName","Verdana");
this.Response.AppendCookie(cookie);
}
}
private string getStyle(string key)
{
string val = null;
HttpCookie cookie= this.Request.Cookies["preferences1"];
if (cookie != null)
{
val = cookie.Values[key];
}
return val;
}
}
2.7.5 使用Query String
Query String是在用户请求的URL后加上相应的参数来使用的,只能在使用HTTP GET方式调用URL时可用。
优点:
d. 不需要服务器资源,参数附在URL里面;
e. 应用面广,几乎所有浏览器都支持;
f. 实现简单,服务端使用Request对象可直接读取。
缺点:
a. 参数直接对用户可见,不安全;
b. URL长度的限制,多数浏览器不支持超过255字符的URL。
示例代码:
http://www.cache.com/login.asp?user=ronen
string user = Request.QueryString["User"];
2.7.6 小结
下表是使用客户端缓存的建议:
缓存机制 | 适用情况 |
Hidden Field | 当安全性要求不高时,在页面中存储少量数据以提交到服务器上的本页面或其它页面。 |
ViewState | 在单个页面中存储少量信息满足页面多次回传的要求。提供基本的安全机制。 |
Hidden Frame | 在客户端存储数据,避免了数据到服务器的回传。 |
Cookie | 当安全性要求不高时,存储少量数据在客户端。 |
Query String | 当使用页面地址连接页面时传输少量参数。 |
2.8 使用Internet Explorer缓存
IE提供了缓存机制,可以实现对页面的数据进行缓存,同时可以指定过期时间。用户在IE中请求此页面,如果当过期时间没有到,则自动从缓存中提取并呈现;否则,就到服务器上获取新版本。IE对页面的缓存可以在IIS中设置。
适合在Internet Explorer中缓存的内容
- 页面中的图像文件;
- 静态的文本内容;
- 页面的标题栏和页脚内容——改变频率很低,可以给用户一个迅速相应;
- 网站的首页——更改次数页时相对较少的;
- 使用动态HTML在客户端保存的特定数据。比如客户自定义的颜色和布局设置信息。
优点:
- 减少对服务器的请求和网络负担;
- 支持离线浏览;
- 可以实现基于XML的客户端复杂应用。
缺点:
- 客户端的过期时间必须预先指定而不能依赖于服务器更新;IE采用的是Lazy更新机制,优先从缓存中提取数据;
- 对其它客户端浏览器没有作用;
- 存储的数据没有加密,不能保证客户端数据安全。
示例代码:
<META HTTP-EQUIV="expires" CONTENT="Tue, 23 Jun 2002 01:46:05 GMT">
3 总结
本文档介绍了缓存和状态数据存储的相关概念,以及可供使用的缓存技术,介绍了各种技术的适用范围,并对其优缺点进行了说明,另外有简单的性能比较和简单的示例代码。更多内容请参看相应的参考资料。