如何为Web应用添加浏览器缓存功能
现有一个可根据固定格式URL请求返回数据内容的站点,如果想减少网络传输压力的话,使用浏览器缓存可以起到很不错的效果。但是,如果仅仅是通过下面设定来实现:
1 Context.Response.Cache.SetCacheability(HttpCacheability.Public);
因为如果仅仅是设置这一项,会使得浏览器缓存被保存1年,但是凡是在此过程中出现的同名文件替换,都会导致不能更新到客户端,肯定是不行的。所以还需要同时对文件的修改时间进行保存,主要是通过对请求中带有的Context.Request.Headers["If-Modified-Since"] 的值与本地文件的LastWriteTime进行比较,如果相同,则直接返回StatusCode值304表示内容相同,可以使用浏览器缓存,否则会直接返回文件数据流,且不用设置StatusCode为200,因为会自动进行设置,其中一些关键的步骤代码如下:
1 // 获取请求携带的最后修改时间戳
2 string ifModifiedSinceStr = _context.Request.Headers["If-Modified-Since"];
3 DateTime ifModifiedSince = DateTime.Parse(ifModifiedSinceStr);
4 // 获取文件信息
5 FileInfo fi = new FileInfo(_fileFullPath);
6 // 比较两个时间是否一致
7 if (fi.LastWriteTime == ifModifiedSince)
8 { // 可以使用浏览器缓存
9 _context.Response.StatusCode = 304;
10 _context.Response.StatusDescription = "Not Modified";
11 }
12 else
13 {
14 // 有时间标签,让浏览器缓存不失效
15 _context.Response.Cache.SetCacheability(HttpCacheability.Public);
16 // 一年后失效
17 _context.Response.Cache.SetMaxAge(TimeSpan.FromDays(365));
18 // 设置最后修改时间
19 _context.Response.Cache.SetLastModified(fi.LastWriteTime);
20
21 // 将文件读入数据流
22 _context.Response.TransmitFile(_fileFullPath);
23 }
24 // 关闭请求
25 _context.Response.End();
3 DateTime ifModifiedSince = DateTime.Parse(ifModifiedSinceStr);
4 // 获取文件信息
5 FileInfo fi = new FileInfo(_fileFullPath);
6 // 比较两个时间是否一致
7 if (fi.LastWriteTime == ifModifiedSince)
8 { // 可以使用浏览器缓存
9 _context.Response.StatusCode = 304;
10 _context.Response.StatusDescription = "Not Modified";
11 }
12 else
13 {
14 // 有时间标签,让浏览器缓存不失效
15 _context.Response.Cache.SetCacheability(HttpCacheability.Public);
16 // 一年后失效
17 _context.Response.Cache.SetMaxAge(TimeSpan.FromDays(365));
18 // 设置最后修改时间
19 _context.Response.Cache.SetLastModified(fi.LastWriteTime);
20
21 // 将文件读入数据流
22 _context.Response.TransmitFile(_fileFullPath);
23 }
24 // 关闭请求
25 _context.Response.End();
Hope it helps!