手机版

浏览器缓存动态网页的ASP.NET性能优化方法

时间:2021-10-17 来源:互联网 编辑:宝哥软件园 浏览:

OutputCache针对的是所有访问服务器资源的用户,而本文介绍的浏览器缓存针对的是个人用户,让浏览器无法在我们的控制下持续访问服务器上的动态内容,也就是说我们应该让浏览器成为我们缓存机制的一部分,在某些特定场景下最大化ASP.NET站点的性能。如果说OutputCache从广度上提高了并发效率,那么浏览器缓存则从深度上提高了效率。HTTP Header 1.1简介浏览器的第一个请求假设我们请求一个URL地址,比如我的服务器上的一个静态页面http://192 . 168 . 0 . 77/luminji 2/html/test1 . htm,会返回如下HTTP Header信息:image

HTTP头信息中每个参数的含义暂时不在这里说明。我们关注与本文讨论相关的三条信息:第一,响应状态为200OK,表示从服务器成功抓取数据。其次,最后修改:周五,09sep201102:56:45 GMT。这是WEB服务器告诉浏览器这个文件的最后修改日期是星期五,09sep201102:56:45 GMT。必须注意的是,现在是GMT,也就是格林威治标准时间,国内一般使用GMT 8时区(取决于系统的地区设置)。最后,是Etag,这是WEB服务器当前正在响应的对象的标志值。就一个对象而言,比如一个html文件,如果它被修改了,它的Etag就不会被修改。1.2什么是浏览器缓存?我使用FireFox。在地址栏中键入大约:cache。Device=disk,我们会看到浏览器缓存的HTML页面,如下所示:image

(注意这里的最后修改与Http头中的最后修改无关。).每个浏览器都将有自己的缓存机制,但它们都是相似的,因此暂时不在这里列出。1.3如何命中缓存,再次请求刚才的URL,我们得到如下的头部信息:image

可以看到状态已经变成了304未修改,相当于WEB服务器告诉浏览器,请使用自己的缓存,不要来找我下载文字内容。那么,根据什么,WEB服务器决定这样告诉浏览器呢?在这里,我们需要在标题信息中请求如果修改自。请求由浏览器发送到网络服务器。一旦包含了这个参数,浏览器就会对WEB服务器说:请检查您的内容是否在2011年9月9日星期五之后发生了变化。WEB服务器会根据这个来判断,如果没有变化,会返回304未修改给浏览器,就像这个例子一样。这样,浏览器将在本地获取文本数据,减少了网络流量。If-None-Match是Etag判断模式,与上次修改的目的一致,所以这里暂时不列出。假设我们修改文件test1.htm,想象一下结果会是什么,肯定是200OK。正是通过这种机制,静态网页被缓存在浏览器和网络服务器之间。二:asp.net的浏览器缓存实现我们上面说的是静态页面的情况,那么aspx页面,也就是动态页面会是什么样的情况呢?现在,让我们创建一个动态网页来看看。首先,创建最简单的aspx,如下所示:复制代码如下: body %=DateTime。现在%/体。索要,得到如下标题信息:image

然后经过反复请求,发现每次都是200OK,发现头消息少了一条重要消息,就是上次修改的。如果服务器没有告诉浏览器自己对象的最后修改日期,那么浏览器每次都要去服务器那里重新获取所有数据。看到这里,我们应该明白,为了让浏览器不获取数据,动态程序必须尝试自己添加这个头信息。好了,现在我们可以像这样在ASPX的后台代码中添加最简单的头信息:复制代码如下: protected void page _ load(object sender,event args e){ this . response . add header(' last-modified ',DateTime。现在. ToString('U ',DateTimeFormatInfo。不变量信息));}添加头部信息后,我们发现再次请求URL后,头部信息变化如下:image

令人欣慰的是,响应头包含最后修改,而请求头包含如果修改自。当然,我们仍然发现每个请求仍然是200OK。当然,由于头部信息是由ASP.NET在后台添加的,所以我们想要返回给服务器什么样的响应状态的逻辑必须由我们自己来写。现在,我们假设希望浏览器缓存10秒,完整的代码应该如下:复制代码如下: protected void page _ load(object sender,event args e){ this . response . add header(' last-modified ',DateTime。现在. ToString('U ',DateTimeFormatInfo。不变量信息));日期时间IfModifiedSince自;if (DateTime。特里帕斯(这个。request . headers . get(' If-Modified-after '),out If Modified after(){ If((DateTime)。现在-如果修改自。AddHours(8))。10秒){回应。状态='304未修改';回应。StatusCode=304返回;}}//others}这次修改后,如果我们在10秒内继续请求aspx页面,总会回到304状态,也就是浏览器不会去服务器获取文本,只会在本地读取自己的缓存,这样服务器的压力自然会减轻。如果10秒内没有向服务器请求这个页面,10秒后会返回200OK,也就是回到服务器获取页面数据。现在用AB模拟100个并发用户做1000个请求,对比结果如下(注意,为了增强效果,我们需要在后台模拟一些耗时的动作,比如读取数据库):image

左边是未缓存的aspx页面,右边是缓存的aspx页面。如您所见,吞吐率相差10倍。建议在使用ab进行压力测试时,需要添加If-Modified-from的表头信息。命令如下:c : \ ab-n 1000-c100-h ' if-modified-自:星期五起。09 2011年9月09:35336023 GMT ' http://192 . 168 . 0 . 77/luminji 2/aspx/test1 . aspx本文代码下载:MvcApplication320110909.rar III:问题在上面提到的浏览器缓存实现中提出。浏览器是否需要调用缓存是通过浏览器和WEB服务器之间的通信协调机制来决定的,这意味着动态程序仍然需要处理来自客户端的请求。如果有一种机制允许浏览器在不请求服务器的情况下决定是否调用缓存,则可以完全消除服务器处理。下一篇文章将继续解释这个机制。

版权声明:浏览器缓存动态网页的ASP.NET性能优化方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。