如何为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!
分类:
开发技术
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述