网页优化系列二:使用Cache缓存静态文件、图片(asp.net版)

  网站中存在一些不会经常变更的内容如静态文件、图片等,我们称之为静态资源。针对这些静态资源使用cache缓存到客户端中,以减少用户再次浏览该网页时的请求量,从而加速了网页的加载、呈现速度。同样,要设置静态资源缓存到客户端,我们需要加一个中间层来处理静态资源的请求。下面以图片为例进行说明。(若图片十分巨大情况下才使用该方法,若图片k级数的话,初次加载速度会更慢,因为IIS对于静态文件和动态文件的处理是不同的,如果图片容量小,动态文件处理的时间占大部分总体加载时间)

未优化:

  Default.aspx

1 <html>
2   <head>
3   <head>
4   <body>
5      <img src="images/back.gif"/>
6   <body>
7 </html>

首次访问和再次访问页面都要向服务器请求图片。

优化后:

 Default.aspx:

1 <html>
2  <head>
3  <head>
4  <body>
5    <img src="ImageRequestHandler.ashx?p=images/back.gif"/>
6  <body>
7 </html>

ImageRequestHandler.ashx

 1 public void ProcessRequest (HttpContext context) {
 2         string path = context.Server.MapPath(context.Request.QueryString[0]);
 3         string suffix = path.Split('.')[path.Split('.').Length-1];
 4         context.Response.ContentType = string.Format("image/{0}",suffix.ToLower().Equals("png")?"x-png":suffix);//设置MIME,如果是png文件,MIME信息为text/x-png
 5         context.Response.Expires = 60*24*30;//设置图片30天过期
 6         ImageFormat ift = ImageFormat.Jpeg;//设置默认文件格式
 7         Image img = Image.FromFile(path);
 8         if(suffix.ToLower().Equals("gif"))
 9         {
10             ift = ImageFormat.Gif;
11         }else if(suffix.ToLower().Equals("png"))
12         {
13             ift = ImageFormat.Png;
14         }
15         MemoryStream ms = new MemoryStream();
16         img.Save(ms,ift);
17         context.Response.OutputStream.Write(ms.GetBuffer(),0,ms.Length);

  这里只处理了gif、Jpeg和png格式的图片文件,其他格式的图片文件大家按实际添加修改。假如处理中没有png格式的文件,那么15行至17行的代码可以改写成

img.Save(context.Response.OutputStream,ift);

那是为什么呢?那是因为Response.OutputStream这个流的无法往回读取造成的,也就是它的CanSeek属性是false。png图像生成的时候不像jpeg,不是流式的,已经写入的就不再管了,而是需要往回不断地写入结构数据。但是response流无法往回seek,所以直接用就不行了。改成一个可以seek的MemoryStream,先生成好png图片,然后再输出到response流。否则会出现GDI+一般性错误。

请求数一样但图片是从cache中获取的,也没有出现请求服务器后,服务器返回304的情况。

下面总结一下设置文件缓存到cache后,触发读取cache已有文件的操作。前提:文件还没过期

1.在浏览器地址栏输入地址,按跳转;

2.点击页面上的超链接;

3.触发服务器控件的事件;

4.脚本代码使用window.open(),location.href='',location.assign(),location.replace()。

下面是即使文件还没过期也不会读取cache中已有文件的操作。

1.按浏览器的刷新按钮;

2.脚本代码使用location.reload()。

关于浏览器的后退和前进按钮,它们与文件是否启用了缓存无关。它们是调用的是history cache中的文件。

更多:网页优化系列三:使用压缩后置viewstate

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微服务

RabbitMQ的基本使用到高级特性

简介 继上一篇 CentOS上安装RabbitMQ讲述RabbitMQ具体安装后,这一篇讲述RabbitMQ在C#的使用,这里将从基本用法到高级特性的使用讲述。...

322110
来自专栏晓晨的专栏

asp.net mvc 实现上传文件带进度条

41120
来自专栏kwcode

Asp.Net使用编辑器(ueditor)

1、  1.4.3以上版本将不再承诺支持ie6/ie7。 2、如果是aspx 需要加上  ValidateRequest="false" 3、Web.confi...

42460
来自专栏bluesummer

用Token令牌维护微服务之间的通信安全的实现

在微服务架构中,如果忽略服务的安全性,任由接口暴露在网络中,一旦遭受攻击后果是不可想象的、 保护微服务键安全的常见方案有:1.JWT令牌(token) 2.双向...

39070
来自专栏自动化测试实战

《selenium2 python 自动化测试实战》(5)——键盘事件

40360
来自专栏林德熙的博客

win10 uwp 存放网络图片到本地 下载图片保存图片从本地打开所有代码Nuget安装

有时候我们的网络很垃圾,我的的UWP要在第一次打开网络图片,就把图片存放到本地,下次可以从本地打开。 有时候用户使用的是流量网络,不能每次都联网下载。 我们不得...

9310
来自专栏技术博客

WCF HttpContext.Current为空的问题

原来在项目中使用HttpContext.Current没什么问题,但是到了中期阶段,项目重构等,并且要求使用WCF,所以就出现了HttpContext.Curr...

12020
来自专栏跟着阿笨一起玩NET

Asp.net中把DataTable或DataGrid导出为Excel

当前编码的一个项目中有把查询结果(显示在DataGrid)导出为excel的需求,尝试了几种方法,作为技巧拿来和大家分享。 内容: 服务器端实现Data...

21310
来自专栏张善友的专栏

使用API Key验证WCF Data Service

Ron Jacobs 有篇文章介绍如何在WCF Rest Service中使用API Key验证:http://blogs.msdn.com/b/rjacobs...

25480
来自专栏雪胖纸的玩蛇日常

python3+django2 开发易语言网络验证(中)

41670

扫码关注云+社区

领取腾讯云代金券