ASP.NET性能优化之减少请求

在上篇《ASP.NET性能优化之让浏览器缓存动态网页》中的方案中,浏览器发送If-Modified-Since将是否需要使用自己的缓存交给WEB服务器去决定,服务器告知浏览器去读缓存,浏览器才会去读缓存。这种机制存在的性能损耗,就是服务器的ASP.NET仍旧要接收请求,处理请求。此篇所讲的机制是让浏览器自己去决定是否去读缓存,这样就彻底消灭了针对服务器的请求。

1:减少静态页面请求

要让静态页面支持这个需求,我们需要用到http头中的Cache-Control: max-age。值得注意的是Cache-Control是在HTTP/1.1协议下的标识,它是HTTP/1.0协议中的Expires的升级。为了让静态页支持Cache-Control,一种方案是在IIS中进行设置,如下,我在需要静态缓存的页面或者文件夹上右键->属性:

我在这里将过期时间设置为1分钟,然后,我们通过HttpWatch观察IE请求该页面(第一次请求),得到的HTTP头如下:

可以看到其得到的http头中已经有了Cache-Control: max-age=60这一项。

现在,我需要在1分钟内反复请求该静态页,请求的行为我们分别通过下面几种方式来实现,

F5 代表浏览器的一次刷新,它对Last-Modified有效,但是对Cache-Control无效
点击“转到”或者光标移入地址栏然后回车 对Cache-Control有效
CTRL+F5 强制刷新,返回所有正文

我们通过HttpWatch得到的结果如下:

需要注意我在图中用红字和红框的标识:

首次请求 返回状态码200,显然得到全部正文,为545字节。
F5 刷新,对Last-Modified有效,它是让服务器判断是否需要读取缓存,所以,依然存在请求和返回数据,我们可以看到,分别是352和239。状态码是304。
点击“转到”或者光标移入地址栏然后回车 对Cache-Control有效,是浏览器自己决定是否读取缓存,由于是在1分钟内,所以,浏览器没有向WEB服务器发送请求,我们可以看到send和receive的数据全部是0。无交互,故无状态码。
ctrl+f5 相当于是强制刷新,所以状态码200OK,返回全部正文数据,我们可以看到和第一次请求是一样的,为545字节。

(题外话,上面的图中有一个针对favicon.ico的404,我们应该始终为网站提供favicon.ico,它是你可以设置的网站LOGO,不然有些浏览器会反复去请求该LOGO,这也会带来性能损耗)。

经过上面的处理后,可以遇见我们相比上一篇更进一步减少了HTTP请求,提升了效率,因为总有一些用户会通过“转到”或者光标移入地址栏然后回车去请求数据。我们可以根据实际需求去设定特定页面的缓存时间。

1.1 通过web.config设置静态文件缓存

在上面的示例中,我们通过IIS设置了静态文件的缓存,也可以在web.config中进行设置,如下(在<configuration>下):

<system.webServer>
  <validation validateIntegratedModeConfiguration="false"/>
  <modules runAllManagedModulesForAllRequests="true"/>
  <staticContent>
    <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="0.00:00:60"/>
  </staticContent>
</system.webServer>

1.2 关闭静态文件缓存

也可以对单独的文件夹或者文件关闭缓存,如下设置(在<configuration>下):

<location path="test2.htm">
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="DisableCache"/>
    </staticContent>
  </system.webServer>
</location>

2:减少动态页面请求

有了对以上静态页面或者说资源的分析之后,我们知道,可以对动态页面请求采用相同的策略,这需要我们自己写代码实现:

protected void Page_Load(object sender, EventArgs e)
{
    //处理点击“转到”或者光标移入地址栏然后回车,也就是本文所阐述的
    this.Response.AddHeader("Cache-Control", "max-age=60");
    //真是用来处理F5刷新的,也就是对Last-Modified有效
    this.Response.AddHeader("Last-Modified", DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo));
    DateTime IfModifiedSince;
    if (DateTime.TryParse(this.Request.Headers.Get("If-Modified-Since"), out IfModifiedSince))
    {
        if ((DateTime.Now - IfModifiedSince.AddHours(8)).Seconds < 60)
        {
            Response.Status = "304 Not Modified";
            Response.StatusCode = 304;
            return;
        }
    }
}

结果如下:

该结果与我们使用静态页面完全一致。

2.1使用配置文件配置

也可以在配置文件中批量对动态文件进行配置,如下:

<system.web>
  ……
  <caching>
    <outputCacheSettings>
      <outputCacheProfiles>
        <add name="cache1" duration="60" location="Client" varyByParam="none"/>
      </outputCacheProfiles>
    </outputCacheSettings>
  </caching>
</system.web>

然后在页面前台引用:

<%@ OutputCache CacheProfile="cache1" %>

本文代码比较简单,关键是要体会其中所蕴含的思想,即:把浏览器当成你的网站的缓存的极其重要的一部分。

备注

在本篇中,我使用了AddHeader来进行http头的添加,上篇中有朋友提出来使用Response.Cache.SetMaxAge方法,需要提醒的是,使用该方法,将导致丢失304状态。深层次原因不再细究。

时间: 2024-08-28 11:44:54

ASP.NET性能优化之减少请求的相关文章

知识巩固——性能优化之减少http请求

1.css 雪碧图 sprites 其实更高深的应该是把图标做成字体文件直接引用 2.图片地图 类似上,area标签的coords属性 3.合并脚本和样式表,js和css 4.使用base64码减少请求,只针对教小的图片,还是归到1去,可以设成字体 5.新思路,将图片转码后放在js文件的特定对象中,引用时直接获取该对象的这些值转为图片 6.................

ASP.NET 性能优化

一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的系统具有扩展性,也可以减少数据库服务器响应请求的工作量. 如果用动态的SQL语句来返回多个数据集,那用存储过程来替代动态的SQL语句会更好些.是否把业务逻辑写到存储过程中,这个有点争议.但是我认为,把业务逻辑写到存储过程里面可以限制返回结果集的大小,减小网络数据的流量,在逻辑层也不用在过滤数据,这是

Asp.net性能优化技巧

[摘 要] 我只是提供我几个我认为有助于提高写高性能的asp.net应用程序的技巧,本文提到的提高asp.net性能的技巧只是一个起步,更多的信息请参考<Improving ASP.NET Performance>一书. 1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响.系统将用户

ASP.NET性能优化小结(ASP.NET&amp;C#)

ASP.NET: 一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的系统具有扩展性,也可以减少数据库服务器响应请求的工作量. 如果用动态的SQL语句来返回多个数据集,那用存储过程来替代动态的SQL语句会更好些.是否把业务逻辑写到存储过程中,这个有点争议.但是我认为,把业务逻辑写到存储过程里面可以限制返回结果集的大小,减小网络数据的流量,在逻辑层也不

asp.net性能优化之使用Redis缓存(入门)

1:使用Redis缓存的优化思路 redis的使用场景很多,仅说下本人所用的一个场景: 1.1对于大量的数据读取,为了缓解数据库的压力将一些不经常变化的而又读取频繁的数据存入redis缓存 大致思路如下:执行一个查询 1.2首先判断缓存中是否存在,如存在直接从Redis缓存中获取. 1.3如果Redis缓存中不存在,实时读取数据库数据,同时写入缓存(并设定缓存失效的时间). 1.4缺点,如果直接修改了数据库的数据而又没有更新缓存,在缓存失效的时间内将导致读取的Redis缓存是错误的数据. 2:R

ASP.NET性能优化

http://travel.tianya.cn/travelPlan/showPlan?planId=8411155 http://travel.tianya.cn/travelPlan/showPlan?planId=8411156 http://travel.tianya.cn/travelPlan/showPlan?planId=8411157 http://travel.tianya.cn/travelPlan/showPlan?planId=8411158 http://travel.

网站性能优化 - 数据库及服务器架构篇

我先前曾写过三篇有关网站系统.ASP.NET 性能优化的文章,分别从 SQL 语句.数据库设计.ASP.NET 功能.IIS 7 的套件,来探讨此一性能议题.本帖算是系列作的第四篇,整理了一些我看过的书籍和文章,改从「负载均衡.服务器架构.数据库扩展」的角度,提出一些性能优化的建议,以供有建设中大型网站需求的网友们作为参考. 小弟我先前写过的三篇帖子: (一) 30 分钟快快乐乐学 SQL Performance Tuninghttp://www.cnblogs.com/WizardWu/arc

何俊谈阿里巴巴前端性能优化最佳实践-笔记

网站页面前端优化对网站核心页面基于Wise load的原则做定点性能优化,减少HTTP请求,减少DNS请求时间,减少页面DOM的数量,做一些图片.JS压缩等.减少HTTP请求方案:阿里开发了自动合并CSS和JS静态文件的框架,对于减少页面DNS数方面采用前端延迟加载框架,主要负责页面加载时只加载首屏,用户滚动页面时才加载二屏或三屏,这样对网站的性能包括流量都是很大的提升和节约. Web I/O(高并发)方面的优化,使用高性能Web服务器,另外在冬天页面处理上,尽可能地减少冬天页面所占比例,采用一

mysql性能优化教程(转)

Mysql 性能优化教程 目录 目录 背景及目标 Mysql 执行优化 认识数据索引 为什么使用数据索引能提高效率 如何理解数据索引的结构 如何理解影响结果集 理解执行状态 常见分析手段 分析流程 总结 Mysql 运维优化 存储引擎类型 内存使用考量 性能与安全性考量 存储压力优化 运维监控体系 Mysql 架构优化 架构优化目标 防止单点隐患 方便系统扩容 安全可控,成本可控 分布式方案 分库&拆表方案 主从架构 故障转移处理 缓存方案 缓存结合数据库的读取 缓存结合数据库的写入