Middleware (1) — File Server

1 Overview

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

还有一个中间件 FileServerMiddleware 用来依次注入上述三种的中间件。

这些类型中间件的 Options(SharedOptions) 包含以下共有的属性

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

2 DefaultFilesMiddleware

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

毫无疑问,将会返回一个 Hello World , 那么假设我们在 wwwroot 目录下面增加了一个 index.html 文件

并且在 Configure 方法中 app.Run 调用之前增加下面两个方法

app.UseDefaultFiles();app.UseStaticFiles();

那么在运行应用程序的时候,得到的结果是

发现前面增加 index.html 页面被返回。这就是 DefaultFiles 的功能,当访问的路径(目录)没有对应的文件的时候,将挑选出默认的页面返回。

接下来我们探索它是怎么实现的。 DefaultFileOptions 继承 SharedOptions 并包含了 DefaultFileNames 属性,该属性指定默认的文件名,初始化有四种:

如果我们不指定 FileProvier ,那么将会以 wwwroot 目录,创建一个 PhysicalFileProvider 对象。那么这个中间件是如何工作的呢?

对于直接使用 UseDefaultFiles 的扩展方法,它是返回的 wwwroot 目录代表的 IFileProivder

RequestPath 则默认是为空字符串,当访问 https://localhost:43323/ 时候,由 DefaultFiles 中间件处理后,访问的请求路径就变成了 https://localhost:43323/index.html ,而这个交给 StaticFiles 处理了。

2 StaticFileMiddleware

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

StaticFileMiddleware 的配置条件增加了下面几个内容

这个中间件的处理流程是这样的

请求的过程是交给 StaticFileContext 处理的,分为两步

LookupFileInfo

这个方法主要目的是根据文件的相对路径,通过 IFileProvider 得到文件基本信息

ServeStaticFile

在处理静态文件处理之前,需要处理请求 Header 中特殊情况

如果请求 Header 中包含了 If-Match 字段,表明只有请求的资源的 etagIf-Match 中内容有一项完全相同的时候,才能返回资源, 比如

If-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"

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

If-Match: *

If-Match 相反的,只有 etag 不匹配的时候,才会返回请求的响应。

请求资源的只有在 If-Modified-Since 指定的时间之后修改,才会返回请求响应

请求的资源只会在 If-Unmodified-Since 指定的时候之后没有修改,才会返回请求的响应

HTTP 请求可以请求部分数据,所以 If-Range 用来判断是否符合 Range 请求。这个其中的条件分为两种

如果 If-Range 条件满足,就需要解析 HeadersRange 指定的长度大小,比如说

Range: <unit>=<range-start>-
Range: <unit>=<range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>
Range: <unit>=-<suffix-length>

注意 Asp.NET Core 不支持多个区间段的请求。

在获取上述的信息后,就开始处理请求

3. DirectoryBrowserMiddleware

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

DirectoryBrowserOptions 增加了一个属性

该中间件处理比较简单,对于满足请求,通过 IFileProvder 获取这个目录下所有的 FileInfo 信息,然后交给 IDirectoryFormatter 接口进行渲染。默认的实现方式,就是渲染出一张表。

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