这个系列的初衷是便于自己总结与回顾,把笔记本上面的东西转移到这里,态度不由得谨慎许多,下面是我参考的资源:
记在这里的东西我会不断的完善丰满,对于文章里面一些局限于我自己知识积累的观点,希望没有跳走坚持看完的朋友,能够予以指正和鼓励.
系列目录
静态文件
在上节中间件一节我们提到:静态文件中间件可以处理对静态文件的请求,并让管道的其余部分短路,从而起到终端中间件的作用
这一节我们对静态文件做一个更深入的了解. 以一个新建的.Net core Web项目(有视图模型控制器的模版)为例
提供静态文件
应用的Web主机必须识别内容根目录。
项目Program.cs内容如下, 采用WebHost.CreateDefaultBuilder方法可将内容根目录设置为当前目录:
1 public class Program 2 { 3 public static void Main(string[] args) 4 { 5 CreateWebHostBuilder(args).Build().Run(); 6 } 7 8 public static IWebHostBuilder CreateWebHostBuilder(string[] args) => 9 WebHost.CreateDefaultBuilder(args) 10 .UseStartup<Startup>(); 11 }
提供 Web 根目录内的文件
静态文件存储在项目的Web根目录中。 默认目录是 <content_root>/wwwroot,所以在项目wwwroot下面我们看到了如下结构
但是仅仅将内容根目录设置为当前目录还不行,我们还得在Starup启动类的Configure方法下添加静态文件中间件组件才行,
1 public void Configure(IApplicationBuilder app) 2 { 3 app.UseStaticFiles();
4 }
这样wwwroot目录下的组员文件才能被访问,例如引用css文件
<link rel="stylesheet" href="~/css/site.css" />
假设我们把上述的UseStaticFiles方法注释掉,我们启动项目后就会发现页面的样式完全发生变化,那是因为在wwwroot里面的样式文件被禁止访问了
更改默认目录
上面说到静态文件默认的目录是 <content_root>/wwwroot,如果想换成别的命名,例如:<content_root>/staticroot,该如何操作呢?
1 public class Program 2 { 3 public static void Main(string[] args) 4 { 5 CreateWebHostBuilder(args).Build().Run(); 6 } 7 8 public static IWebHostBuilder CreateWebHostBuilder(string[] args) => 9 WebHost.CreateDefaultBuilder(args) 10 //当前目录下的staticroot文件夹 11 .UseWebRoot(Path.Combine(Directory.GetCurrentDirectory(), "staticroot")) 12 .UseStartup<Startup>(); 13 }
这样这样静态文件的默认目录由 <content_root>/wwwroot变为<content_root>/staticroot,如果不将项目的静态资源转移到<content_root>/staticroot下,那么项目中的静态资源将无法被访问
提供 Web 根目录外的文件
如果我们使用默认设置,那么静态文件的访问都是跳到了wwwroot下,这个时候问题就出现了,,假设有如下的目录结构
怎么设置能够使得同级目录也能够被访问,比如既能够访问<content_root>/wwwroot/img/header.jpg,又能够访问<content_root>/MyStaticFiles/images/header.jpg
这时候就需要有参数的UseStaticFiles方法,通过StaticFileOptions对象来解决
1 public void Configure(IApplicationBuilder app) 2 { 3 // For the wwwroot folder 4 app.UseStaticFiles(); 5 // For the /MyStaticFiles url 6 app.UseStaticFiles(new StaticFileOptions 7 { 8 FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")), 9 RequestPath = "/MyStaticFiles" 10 }); 11 }
这样设置,2个同级目录就都可以访问了
设置 HTTP 响应标头
在静态文件中间件组件中,上述的StaticFileOptions 对象还可用于设置 HTTP 响应标头。
举例而言,以下代码除了配置从 Web 根目录提供静态文件外,还设置 Cache-Control 标头:
1 public void Configure(IApplicationBuilder app, IHostingEnvironment env) 2 { 3 var cachePeriod = env.IsDevelopment() ? "600" : "604800"; 4 app.UseStaticFiles(new StaticFileOptions 5 { 6 OnPrepareResponse = ctx => 7 { 8 // Requires the following import: 9 // using Microsoft.AspNetCore.Http; 10 ctx.Context.Response.Headers.Append("Cache-Control", $"public, max-age={cache