Middleware (1) — File Server

1 Overview

ASP.NET core 中对静态文件的处理的中间件是 Microsoft.AspNetCore.StaticFiles 这个包。其中包含了如下的中间件:

  • DirectoryBrowserMiddleware
  • StaticFileMiddleware
public PathString RequestPath {get; set;}
public IFileProvider FileProvider {get; set;}
public bool RedictToAppendTrailingSlash {get; set;}

2 DefaultFilesMiddleware

首先这个中间件的作用是什么呢?假设我们的 Asp.Net core 应用程序如下

app.UseDefaultFiles();app.UseStaticFiles();
  • default.hmtl
  • index.htm
  • index.html
  • 通过 fileProvider 获得所在的目录信息
  • 依次迭代 DefaultFileNames ,如果这个文件在目录下存在,则取回文件信息
  • 将文件名字添加到原本的请求路径中,然后跳出迭代,交给下一个中间件处理。

2 StaticFileMiddleware

我们希望当上面的请求到达的时候,服务器的中间件能够返回相应的 index.html 文件作为请求的响应。

  • UnknownServiceType 如果未知类型,是否还要继续处理,默认是 false
  • DefaultContentType 如果 ContentTypeProvider 没有找到,而且还要继续处理,则返回 DefaultContentType 类型
  • OnPrepareResponse 如果请求完成,是否继续要做一些其他事情的委托,默认不进行任何操作
  1. 如果请求方法不是 Get or Head, 跳过
  2. 如果请求路径不是 RequestPath 开头的,跳过
  3. 如果无法查询到 contentType, 跳过
  4. 然后处理真正的静态文件请求
  • ServeStaticFile
  • 文件大小 (_length)
  • 上一次修改时间 (_lastModified)
  • _etag
If-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"

If-Match: "67ab43", "54ed21", "7892dd"

If-Match: *
  1. ETag: 如果请求资源的实体 Etag 不匹配,则不能进行 Range 请求
Range: <unit>=<range-start>-
Range: <unit>=<range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>
Range: <unit>=-<suffix-length>
  1. 如果是 Head 请求,直接返回 200 OK 响应
  2. 如果是 Range 请求,在计算出需要处理的长度之后,返回响应的文件长度
  3. 否则返回文件的全部内容

3. DirectoryBrowserMiddleware

这个中间可以实现在浏览器中浏览文件夹的功能,如下图所示

A software developer in Microsoft at Suzhou. Most articles spoken language is Chinese. I will try with English when I’m ready

A software developer in Microsoft at Suzhou. Most articles spoken language is Chinese. I will try with English when I’m ready