.Net环境下的缓存技术介绍 5

 

2.7 使用Asp.net客户端缓存和状态

你还可以使用客户端存储页面信息的方式来降低服务器的负担,这种方法提供最低的安全保障,但却有最快的性能表现。由于需要将数据发送到客户端存储,所以数据量有限。

实现客户端缓存的机制有以下五种,接下来将依次介绍:

·隐藏栏位(Hidden Field)

·View State

·隐藏帧(Hidden Frame)

·Cookies

·Query String

这五种方式分别适合于存储不同类型的数据。

2.7.1 使用Hidden Field

你可以将经常改变的少量数据保存在HtmlInputHidden中来维护页面的状态。当每次页面回送的过程中,这些数据都会包含在表单中大送到服务器,所以你要使用HTTP POST方式来提交页面。

使用这种方式的优点如下:

  1. 不需要服务器资源,直接从页面中读取;
  2. 几乎所有的浏览器都支持;
  3. 实现简单;
  4. 由于数据在页面中,所以在web Farm的情况下也可使用。

缺点

  1. 由于可以通过查看源码看到,所以可能会被篡改;
  2. 不支持复杂格式的数据,复杂数据必须使用解析字符串的方式来间接得到;
  3. 当存储大数据的时候会影响性能。

示例:

<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的是类似的,但是具有更高的安全性。

优点

  1. 数据在页面中自动维护,不需要服务器资源;
  2. 实现简单;
  3. 数据是经过加密和压缩的,比hidden field有更高的安全性;
  4. 数据存在客户端,可以在Web Farm情况下使用。

缺点

  1. 存储大数据量时会降低性能;
  2. 和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是可以在客户端存储数据另一种方案,这里不过多介绍。

优点

  1. 不需要服务器资源;数据保存在客户端,在用户请求时发送到服务器上。
  2. 使用简单。Cookie包含简单的键值对,主要保存轻量级的文本数据。
  3. 支持过期策略;可以指定当会话结束时过期,也可指定一个时间策略。

缺点

  1. 数据量的限制;
  2. 用户可能设置为拒绝Cookie;
  3. 安全问题;用户可能更改机器上的cookie信息,造成基于cookie的系统运行失败;
  4. 可能过期或被用户删除,造成一定程度的不可用。

参看示例代码:

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中缓存的内容

  1. 页面中的图像文件;
  2. 静态的文本内容;
  3. 页面的标题栏和页脚内容——改变频率很低,可以给用户一个迅速相应;
  4. 网站的首页——更改次数页时相对较少的;
  5. 使用动态HTML在客户端保存的特定数据。比如客户自定义的颜色和布局设置信息。

优点

  1. 减少对服务器的请求和网络负担;
  2. 支持离线浏览;
  3. 可以实现基于XML的客户端复杂应用。

缺点

  1. 客户端的过期时间必须预先指定而不能依赖于服务器更新;IE采用的是Lazy更新机制,优先从缓存中提取数据;
  2. 对其它客户端浏览器没有作用;
  3. 存储的数据没有加密,不能保证客户端数据安全。

示例代码:

<META HTTP-EQUIV="expires" CONTENT="Tue, 23 Jun 2002 01:46:05 GMT">

3 总结

本文档介绍了缓存和状态数据存储的相关概念,以及可供使用的缓存技术,介绍了各种技术的适用范围,并对其优缺点进行了说明,另外有简单的性能比较和简单的示例代码。更多内容请参看相应的参考资料。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值