[转]NET Core静态文件的缓存方式

本文转自:https://www.cnblogs.com/Leo_wl/p/6059349.html

阅读目录

回到目录

阅读目录

回到目录

回到目录

一、前言

  我们在优化Web服务的时候,对于静态的资源文件,通常都是通过客户端缓存服务器缓存CDN缓存,这三种方式来缓解客户端对于Web服务器的连接请求压力的。

  本文指在这三个方面,在ASP.NET Core中静态文件的实现过程和使用方法进行阐述。当然也可以考虑使用反向代理的方式(例如IIS或Nginx),这些不是本文讨论的内容。

  本文重点展示如何通过StaticFileMiddleware中间件,提高网站的性能。虽然这不是唯一缓存文件的方式,我们还可以通过ResponseCacheAttribute特性为ASP.NET Core Mvc的Controller和Action进行缓存的设置。

回到目录

回到目录

二、StaticFileMiddleware

  1.文件服务与默认缓存规则

  当创建一个ASP.NET Core的项目时,查看Startup.Configure方法,就会看到默认模板生成的添加StaticFileMiddleware中间件的方法。

  1. public void Configure(IApplicationBuilder app)
  2. {
  3. // looging and exception handler removed for clarity
  4. app.UseStaticFiles();
  5. app.UseMvc(routes =>
  6. {
  7. routes.MapRoute(
  8. name: "default",
  9. template: "{controller=Home}/{action=Index}/{id?}");
  10. });
  11. }

  这样就使你的应用程序能够处理,程序目录下wwwroot目录的静态文件内容。在我们添加文件缓存之前,我们先要看一下StaticFileMiddleware默认的策略是怎么样的。当第一次加载程序时,浏览器将打开页面并下载所有的资源连接。假如页面没有错误返回都是正确那么就是返回文件数据和Http Status为200 -OK的状态。

  然后我们看下这个Http请求对应的Response Header,这里会包含ETagLast-Modified两个值。HTTP内容如下:

  1. HTTP/1.1 200 OK
  2. Date: Sat, 15 Oct 2016 14:15:52 GMT
  3. Content-Type: image/svg+xml
  4. Last-Modified: Sat, 15 Oct 2016 13:43:34 GMT
  5. Accept-Ranges: bytes
  6. ETag: "1d226ea1f827703"
  7. Server: Kestrel

  如果再次请求这个地址的话,浏览器将发送ETagLast-Modified的值到服务端,如果两个值没有变化,那么服务端会发送304状态到浏览器,那么浏览器将使用之前的资源而不是重新下载一份。

  这样就提高了,浏览器的响应性能,因为文件都缓存到了客户端,并且通过304状态,服务端与浏览器的请求流量得以减少。

  2.设置文件缓存时间

  当然我们都知道如果要设置某一请求的缓存,只需要设置Header为Cache-Control的值。那么在StaticFileMiddleware中间件中,我们怎么设置这个Header呢?

  1. using Microsoft.Net.Http.Headers;
  2. app.UseStaticFiles(new StaticFileOptions
  3. {
  4. OnPrepareResponse = ctx =>
  5. {
  6. const int durationInSeconds = 60 * 60 * 24;
  7. ctx.Context.Response.Headers[HeaderNames.CacheControl] =
  8. "public,max-age=" + durationInSeconds;
  9. }
  10. });

  设置后每一个静态文件的请求都会执行这个方法,包括200和304状态的请求;而且在这个例子里浏览器会自动缓存这些文件24小时,但是在此期间并不会返回404状态

  一旦max-age设置的时间过期,浏览器就不会再使用本地缓存,而去直接请求服务器端。这样已经避免了一些额外的请求到服务器端了。如果我们在浏览器与服务器中间使用CDN缓存文件数据的话,这样就算客户端浏览器的缓存过期了,但是请求也不会到我们的服务器上,而是请求到CDN缓存服务器。

  下面我们看看文件缓存在ASP.NET Core中是如何判断缓存失效的?.NET Core开源的代码为我们提供了了解它的入口【代码 Source Code】。核心代码如下:

  1. _length = _fileInfo.Length;
  2. DateTimeOffset last = _fileInfo.LastModified;
  3. // Truncate to the second.
  4. _lastModified = new DateTimeOffset(last.Year, last.Month, last.Day, last.Hour, last.Minute, last.Second, last.Offset).ToUniversalTime();
  5. long etagHash = _lastModified.ToFileTime() ^ _length;
  6. _etag = new EntityTagHeaderValue(‘\"‘ + Convert.ToString(etagHash, 16) + ‘\"‘);

  服务器端如果检测到文件改变就会返回200状态给浏览器,如果没有变化则返回304状态给浏览器端。

  不幸的是,一旦我们添加了缓存,浏览器将不再向服务器发出请求。该文件可能已经完全改变或已被完全删除,但如果浏览器不要求,服务器将不能通知浏览器重新发起无缓存的请求!

  3.为静态文件提供版本号

  通常我们都使用形如https://localhost/js/site.js?v=1 这样的地址来解决缓存的问题。通过给静态文件生成唯一的版本号,做为QueryString进行请求时,服务器将重新输出文件内容。

  在ASP.NET Core中Tag Hepers为我们提供了这样的API:

  1. @addTagHelper "*, Microsoft.AspNetCore.Mvc.TagHelpers"
  2. <script src="~/js/site.js" asp-append-version="true"></script>

  这段代码最终在浏览器端会被渲染为如下Html代码:

  1. <script src="/js/site.js?v=Ynfdc1vuMNOWZfqTj4N3SPcebazoGXiIPgtfE-b2TO4"></script>

  如果静态文件发生改变,Tag Helper就是重新计算文件的哈希值,它采用 SHA256的哈希值。当然以前服务器缓存的文件版本也随之失效了。这个asp-append-version Tag Helper可以支持Img、Script和Link元素。

  ASP.NET Core的源代码我们来看看是怎么计算文件变化的:【源代码 Source Code】 。

回到目录

回到目录

三、ASP.NET Core与CDN?

  我们在使用CDN时,因为还要进行开发任务,一般我们都要有两套地址,一套是CDN上的文件地址,一套是本地调试开发用的地址。ASP.NET Core中也为我们提供了Tag Helper来解决这样的问题。直接上代码实例吧:

  1. <link rel="stylesheet" href="//ajax.aspnetcdn.com/ajax/bootstrap/3.0.0/css/bootstrap.min.css"
  2. asp-fallback-href="~/lib/bootstrap/css/bootstrap.min.css"
  3. asp-fallback-test-class="hidden"
  4. asp-fallback-test-property="visibility"
  5. asp-fallback-test-value="hidden" />
  6. <script src="//ajax.aspnetcdn.com/ajax/bootstrap/3.0.0/bootstrap.min.js"
  7. asp-fallback-src="~/lib/bootstrap/js/bootstrap.min.js"
  8. asp-fallback-test="window.jQuery">
  9. </script>

  Tag Helper:asp-fallback-* 解决开发时使用的文件地址问题。 当然它也可以asp-append-version 两个Tag Helper一起使用,这样就实现了,在CDN文件缓存的同步问题。

回到目录

回到目录

四、写在最后

  新的ASP.NET Core为我们提供了很多现有互联网行业的解决方案,也给.NET开发人员引入了先进思想。

  GitHub:https://github.com/maxzhang1985/YOYOFx  如果觉还可以请Star下, 欢迎一起交流。

  .NET Core 和 YOYOFx 的交流群: 214741894

原文地址:https://www.cnblogs.com/freeliver54/p/10360914.html

时间: 2024-12-12 03:37:49

[转]NET Core静态文件的缓存方式的相关文章

NET Core静态文件的缓存方式

NET Core静态文件的缓存方式 阅读目录 一.前言 二.StaticFileMiddleware 三.ASP.NET Core与CDN? 四.写在最后 回到目录 一.前言 我们在优化Web服务的时候,对于静态的资源文件,通常都是通过客户端缓存.服务器缓存.CDN缓存,这三种方式来缓解客户端对于Web服务器的连接请求压力的. 本文指在这三个方面,在ASP.NET Core中静态文件的实现过程和使用方法进行阐述.当然也可以考虑使用反向代理的方式(例如IIS或Nginx),这些不是本文讨论的内容.

细说ASP.NET Core静态文件的缓存方式

2016-11-26 张磊 dotNET跨平台 一.前言 我们在优化Web服务的时候,对于静态的资源文件,通常都是通过客户端缓存.服务器缓存.CDN缓存,这三种方式来缓解客户端对于Web服务器的连接请求压力的. 本文指在这三个方面,在ASP.NET Core中静态文件的实现过程和使用方法进行阐述.当然也可以考虑使用反向代理的方式(例如IIS或Nginx),这些不是本文讨论的内容. 本文重点展示如何通过StaticFileMiddleware中间件,提高网站的性能.虽然这不是唯一缓存文件的方式,我

NET Core 静态文件及JS包管理器(npm, Bower)的使用

NET Core 静态文件及JS包管理器(npm, Bower)的使用 文章目录 在 ASP.NET Core 中添加静态文件 使用npm管理JavaScript包 使用Bower管理JavaScript包 在 ASP.NET Core 中添加静态文件 虽然ASP.NET主要大都做着后端的事情,但前端的一些静态文件也是很重要的.在ASP.NET Core中要启用静态文件,需要Microsoft.AspNetCore.StaticFiles组件.可以通过Nuget添加,或者在project.jso

Nginx设置Js、Css等静态文件的缓存过期时间

location ~.*\.(js|css|html|png|jpg)$ { expires 3d; } expires    3d; //表示缓存3天 expires    3h; //表示缓存3小时 expires    max; //表示缓存10年 expires    -1; //表示永远过期. 如果设置为-1在js.css等静态文件在没有修改的情况下返回的是http 304,如果修改返回http 200 http 304:自从上次请求后,请求的网页未修改过.服务器返回此响应时,不会返回

net core 静态文件

asp.net core 之静态文件目录的操作 文章前言 之前写了一篇关于模拟登录的文章,自我感觉内容不太丰富,今天的这篇文章,希望在内容上能丰富些.本人缺少写文章的经验,技术上也是新手,但我会努力的,希望大家多多支持小弟. asp.net core项目静态文件 创建一个asp.net core 项目的静态文件一般是放在项目目录下wwwroot文件夹,文件目录如下. 如何将静态文件注入到项目中 在startup.cs文件的Configure方法中写入: app.UseStaticFiles();

nginx 配置open_cache_file 静态文件的缓存

open_file_cache max=65535 inactive=30s 最多缓存多少个文件,缓存多少时间open_file_cache_min_uses 1 在30S中没有使用到这个配置的次数的话就删除open_file_cache_valid 40s 多少时间检查一次,如果发现30s内没有用过一次的删除

ASP.NET Core使用静态文件、目录游览与MIME类型管理

原文:ASP.NET Core使用静态文件.目录游览与MIME类型管理 前言 今天我们来了解了解ASP.NET Core中的静态文件的处理方式. 以前我们寄宿在IIS中的时候,很多静态文件的过滤 和相关的安全措施 都已经帮我们处理好了. ASP.NET Core则不同,因为是跨平台的,解耦了IIS,所以这些工作 我们可以在管道代码中处理. 正文 在我们的Web程序开发中,肯定要提供很多的静态文件(比如:JS,CSS)给客户端下载使用.所以我们先来看看ASP.NET Core中是怎么处理的. 当我

《ASP.NET Core 高性能系列》静态文件中间件

原文:<ASP.NET Core 高性能系列>静态文件中间件 一.概述 静态文件(如 HTML.CSS.图片和 JavaScript等文件)是 Web程序直接提供给客户端的直接加载的文件. 较比于程序动态交互的代码而言,其实原理都一样(走Http协议), ASP.NET Core中需要进行一些配置才能提供这些文件. 二.wwwroot 静态文件存储在项目的 Web 程序的 {ContentRoot}/wwwroot目录下,但可通过 UseWebRoot 方法更改路径 . Web 应用程序项目的

在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(二)---静态文件如何部署

目前,较为成熟的技术是采用laravelS组件,注意和laravel 区别laravelS多了一个大写的S,由于laravelS默认监听5200端口,所以laravel项目要做一些调整 例如: 静态文件引入的方式-----从静态资源服务器加载 我们熟悉的js和css引入方式还是通过相对路径引入到标签中,但是如果集成了laravelS组件,这种技术方案就行不通了,网页不会加载样式或js文件,所以我们最好采用从静态服务器加载相关文件的方法.文件laravel5.8官方手册给出了URL::asset(