基于ASP.NET网站缓冲技术的研究

2011-03-14 06:44杨永国何树有
网络安全技术与应用 2011年3期
关键词:有效期缓冲区浏览器

杨永国 何树有

91550部队 辽宁 116023

0 引言

缓冲(caching)技术在现在的网站建设中的作用显得相当重要,由于目前的技术大多是在客户端浏览器发出请求时,动态的生成可浏览网页,如静态HTML网页,然后将根据请求生成的网页传回浏览器,关于动态生成网页的优势长处,想必都有所了解,但是,我们现在要考虑的是如何降低这种技术带来的对性能的更高要求,这种动态生成技术的流行使得对网站的服务器性能要求较高,是因为需要实时的根据浏览器的请求生成网页,在生成复杂网页或是频繁生成相同的页面时,问题显得尤为严重。ASP.NET提供了一种在内存中开辟缓冲区的机制,很好地解决了上述问题。

1 ASP.NET的缓冲机制

ASP.NET为网络应用程序提供了三种缓冲方式,利用在内存中开辟的缓冲区将难以动态生成的页面和访问频率较高的页面或是重要的内容放入缓冲区,当网络应用程序发出请求时,将保存的内容传给浏览器或是应用程序,从而降低了服务器的工作负荷。

1.1 页面输出缓冲

页面输出缓冲是通过保存已生成的动态页面来提高请求和响应的吞吐量,页面缓冲是默认允许的,但是,对于已给定的响应,输出是不加以缓冲的,除非是有直接的代码说明为响应提供页面输出缓冲。

要为响应提供输出缓冲,需指定缓冲区中内容的有效期和建立有访问权限的公有缓冲,这可以通过OutputCache API实现或是使用@OutputCache指令来完成,当缓冲区建立以后,第一次的 GET请求会为缓冲区开辟一个入口,以后的GET请求或是 HEAD请求都利用这个入口来并行地利用输出缓冲的,只要缓冲区中留有请求的内容,输出缓冲是利用有效期来管理缓冲区中的页面的,假设在缓冲区中有一个页面被标记上有效期并且有效期是 60分钟,那么当这个页面在缓冲区中停留的时间超过60分钟时就会被清理出缓冲区。如果此时请求这个页面 那么这个被清理出缓冲区的页面就会根据请求重新创建,然后又一次放入缓冲区标记上新的有效期,这种类型的有效期就是绝对有效期,也就是页面在缓冲区中被保留的时间使用指令@OutputCache声明有效期是:

<%@ OutputCache Duration="60" VaryByParam="none"%>

其中,参数Duration是以秒为单位的,Duration =“60”指定了有效期是60秒,参数 VaryByParam指明页面不会被GET或是POST指令改变。

声明有效期的方法还可以通过 HttpCachePolicy类来实现,由HttpResponse.Cache 属性可以得到关于缓冲内容的说明,比如有效期可否被修改等。

1.2 页面部分缓冲

在将网页整页地放入缓冲区变得不现实时,ASP.NET 提供了将网页的一部分放入缓冲区的方法,页面部分缓冲。事实上,页面部分缓冲也可以看成页面输出缓冲的一种。使用页面部分缓冲,首先要将网页中放入缓冲区的部分分离出来。在网页中使用user control来说明需要缓冲的部分,然后使用@OutputCache 指令标记出这些部分,为这些部分确定有效期等属性。

@OutputCache指令一共有6个属性:

Duration:以秒为单位,指定有效期的时间长度。这是必须的属性。因为任何输出缓冲中的内容都要指定有效期,部分缓冲也是一样。

Location:取值限于枚举集OutputCacheLocation的ANY、Client、Downstream、Server和None五种枚举值,默认值是ANY。当输出缓冲区中的 ASP.NET页面和用户控件(user control)时,这个属性是必须的。

取Client值时,输出缓冲定位于发送请求的客户浏览器。取Server值时,定位于处理请求的服务器。取 Downstream时,输出缓冲定位于处理请求的服务器的下传流。

如果取ANY,那么上面三种情况都是允许的。取None则请求页面的输出缓冲没有被激活,也就是说没有输出缓冲可用。

VaryByCustom:当VaryByCustom取browser值时,根据浏览器的名字和主要的版本信息改变缓冲区内容。如果属性值为自定义的字符串,就必须在应用程序的Global.asax文档中重定义HttpApplication.GetVaryByCustomString方法。

VaryByHeader:根据http头信息来改变缓冲区内容。当有多重头信息时,输出缓冲中会为每个指定的HTTP 头信息保存不同的页面文档。VaryByHeader属性可以应用于缓冲所有http/1.1的缓冲内容,不仅仅是ASP.NET的缓冲。

但是 VaryByHeader属性不支持@OutputCache指令对user control的标记,我们在这里只是提一下这个属性,已使你能获得对@OutputCache指令的全面认识。

当浏览器请求该页面时,创建表单后,将需要缓冲的部分放入缓冲区。再次请求时,会判断请求页面中是否有缓冲区中的页面部分,如果判断结果是肯定的,那么将创建请求页面的其他部分,再加上缓冲区中的内容合成请求页面,作为请求的响应将页面传回浏览器。如果请求的页面在缓冲区中没有部分缓冲页面,那么将再次创建请求页面传回浏览器,并且再次根据@OutputCache 指令将user control部分放入缓冲区中。

1.3 数据缓冲

除了上述的两种缓冲方法以外,ASP.NET还提供一种强大的,易于操作的缓冲机制—数据缓冲。数据缓冲可以在缓冲区中为每个应用程序保存各种对象,这些对象可以根据http的请求被调用。缓冲区对于各个不同的应用程序来说是私有的。

在ASP.NET中,数据缓冲是通过Cache类来实现的。每个应用程序的缓冲区实际上就是Cache类的一个实例。每个应用程序的生存周期就是这个缓冲实例的生存周期。当应用程序重新运行时Cache类实例会重建。通过Cache类的方法,可以将数据对象放入缓冲区中,然后再根据关键字匹配寻找到并加以利用这些对象。

Cache类提供了一个接口,通过这个接口可以完全控制要缓冲的内容,并且可以规定缓冲的时间和方式,一个简单的添加缓冲对象的例子是:

Cache["keyname"] = keyValue;

然后重新找到这个对象,对这个对象的访问是:

keyValue = Cache["keyname"];

if(keyValue != null ) { DisplayData(keyValue); }

在ASP.NET中,主要有三种数据缓冲方式:

(1)清除废物(Scavenging)

当系统的内存资源紧张时,将最不常用的和不重要的内容清除出缓冲区,把内存用来处理频繁访问的方法称为清除废物的缓冲方式。这种方法在缓冲技术中很常见,比如内存的缓冲 Cache。这种方法保证了在缓冲区中的都是重要的和常用的内容。

使用这种方法需要在将对象放入缓冲区时,为这些对象标记优先级和必需的访问频率。

当需要清除废物时,根据对象的优先级来判断哪些是不重要的内容,根据指定的访问频率判断哪些内容的访问频率达不到指定的频率,然后将这些内容清除出内存缓冲区。

实现上,在使用Cache.Add和Cache.Insert方法向缓冲区中加入对象时,可以指定其优先级,优先级一共有6种,由小到大依次为:Low、BelowNormal、Normal、AboveNormal、High和NotRemoveable。默认值是Normal。

(2)有效期

在使用Add 和Instert方法时,还可以为添加的内容标上有效期,通过有效期来判断哪些内容应该被清出缓冲区,这和输出缓冲的方法类似,超过有效期的内容将会被清除出去。Add和Insert方法有两个参数来说明这个方法:

DateTime指定了有效期的时间,可以是绝对时间,比如每天1:00也可以是相对时间,比如从创建开始的30秒。

TimeSpan 决定了创建对象的时间间隔。当对象被清出缓冲区时,所有对该对象的请求都会得到 null,直到对象再次创建并加入到缓冲区中。

(3)关键字匹配

ASP.NET允许根据外部文件,目录或其他的缓冲内容来确定要缓冲的内容,这样就造成了一种依赖关系,可以是依赖外部文件或是依赖关键字。当这种依赖关系改变时,缓冲区中的内容就是无效的,需要被清出内存。这种方法可以有效地更新缓冲区中的内容,尤其是当缓冲内容的数据源被修改时,使用这种方法可以根据这种依赖关系来更新缓冲内容,将修改前的数据作为无效内容清除出内存。

三种方法各有所长,可以根据不同的需要来选择数据缓冲的方法,下面对数据缓冲的类Cache类中的Add和Insert方法进行实例分析。

Add 方法的使用示例:

Cache.Add(key, value, null, DateTime.Now.AddSeconds (15),t,

CacheItemPriority.High, CacheItemPriorityDecay.Slow, onRemove);

我们来逐个的分析参数的含义:

key 缓冲内容的关键字,用来引用缓冲内容的关键字。value 要放入缓冲的内容。dependencies 依赖关系,当依赖关系发生改变,内容就会被标为无效的数据。绝对有效期 这里有效期时间为15秒。时间间隔 这里用变量来表示间隔的时间。优先级 这里取 CacheItemPritorty.BelowNormal即优先级为BelowNormal。访问频率 这里的频率是Slow。onRemove 如果采用onRemove ,那么当这个应用程序在缓冲区中的对象被清出缓冲区时,会通报应用程序。

Insert方法也有和Add方法一样的调用形式,参数的含义也相同,除此之外Insert方法还有简单的调用形式:

Insert(key, value);

Insert(key, value , CacheDependency);

Insert(key, value, CacheDependency, DateTime, TimeSpan);

其中CacheDependency是指依赖关系,DateTime是有效期的时间,TimeSpan是创建对象的时间间隔。

2 结束语

对数据库有所了解的程序员来说,缓冲这个概念一定不陌生,为了保证数据库的安全,数据库对数据的操作都有缓冲机制。同理,ASP.NET中为了保证数据的安全,也引入了缓冲机制,极大的提高了网站的安全性。

[1]王超,张鹏.ASP.NET/XML深入编程技术.北京:希望电子出版社.2009.

[2]赵克立.ASP.NET编程培训教程.北京:清华大学出版社. 2005.

[3]杨云,ASP.NET 典型系统开发详解.北京:人民邮电出版社. 2005.

[4]徐谡,ASP.NET应用与开发教程.北京:清华大学出版社. 2007.

猜你喜欢
有效期缓冲区浏览器
药品效期管理:有效期≠失效期
反浏览器指纹追踪
基于网络聚类与自适应概率的数据库缓冲区替换*
压力容器定期检验合格有效期该从何时起算
结婚证设“有效期”是拿婚姻当儿戏
一类装配支线缓冲区配置的两阶段求解方法研究
环球浏览器
关键链技术缓冲区的确定方法研究
初涉缓冲区
浏览器