如何用ASP.NET Core 6构建高效文件服务器?

摘要:通过HTTP请求获取的Web资源很多都来源于存储在服务器磁盘上的静态文件。对于ASP.NET应用来说,如果将静态文件存储到约定的目录下,绝大部分文件类型都是可以通过Web的形式对外发布的。“Microsoft.AspNetCore.Stat
通过HTTP请求获取的Web资源很多都来源于存储在服务器磁盘上的静态文件。对于ASP.NET应用来说,如果将静态文件存储到约定的目录下,绝大部分文件类型都是可以通过Web的形式对外发布的。“Microsoft.AspNetCore.StaticFiles” 这个NuGet包中提供了三个用来处理静态文件请求的中间件,我们可以用它们搭建一个文件服务器。(本篇提供的实例已经汇总到《ASP.NET Core 6框架揭秘-实例演示版》) [1901]以Web形式发布文件(图片)(源代码) [1902]以Web形式发布文件(PDF)(源代码) [1903]显式文件目录结构(源代码) [1904]显示目录的默认页面(源代码) [1905]定制目录的默认页面(源代码) [1906]设置默认的媒体类型(源代码) [1907]映射文件扩展名的媒体类型(源代码) [1901]以Web形式发布文件(图片) 作为演示实例是ASP.NET应用具有如图1所示的项目结构。在默认作为WebRoot的“wwwroot”目录下,我们将JavaScript脚本文件、CSS样式文件和图片文件存放到对应的子目录(js、css和img)下。该目录下的所有文件将自动发布为Web资源,客户端可以访问相应的URL来读取对应它们的内容。 图1 静态文件发布的项目结构 针对具体某个静态文件的请求是通过StaticFileMiddleware中间件来处理。如下所示的演示程序中调用IApplicationBuilder接口的UseStaticFiles扩展方法注册的就是这个中间件。 var app = WebApplication.Create(); app.UseStaticFiles(); app.Run(); 演示程序运行之后,就可以通过GET请求的方式来读取对应文件的内容,目标文件相对于WebRoot目录的路径就是对应URL的路径,如JPG图片文件“~/wwwroot/img/dolphin1.jpg”对应的URL路径为“/img/dolphin1.jpg”。如果直接利用浏览器访问这个URL,目标图片就会直接以图2所示的形式显示出来。 图2 以Web形式请求发布的图片文件 [1902]以Web形式发布文件(PDF) 上面通过一个简单的实例将WebRoot所在目录下的所有静态文件发布为Web资源,如果需要发布的静态文件存储在其他目录下呢?比如我们将上面演示的应用程序的一些文档存储在图3所示的“~/doc/”目录下,那么对应的程序又该如何编写呢? 图3 发布“~/doc/”和“~/wwwroot”目录下的文件 ASP.NET应用在大部分情况下都是利用一个IFileProvider对象来读取文件的,针对静态文件的读取请求处理也不例外。StaticFileMiddleware中间件内部维护着一个IFileProvider对象和请求路径的映射关系。如果调用UseStaticFiles方法没有指定任何参数,那么这个映射的路径就是应用的基地址(PathBase),采用的IFileProvider对象就是指向WebRoot目录的PhysicalFileProvider对象。上述需求可以通过定制这个映射关系来实现。如下面的代码片段所示,我们在现有程序的基础上额外添加了一次针对UseStaticFiles扩展方法的调用,并利用作为参数的StaticFileOptions配置选项添加请求路径(“/documents”)与对应IFileProvider对象(针对路径“~/doc/”的PhysicalFileProvider对象)之间的映射关系。 using Microsoft.Extensions.FileProviders; var path = Path.Combine(Directory.GetCurrentDirectory(), "doc"); var options = new StaticFileOptions { FileProvider = new PhysicalFileProvider(path), RequestPath = "/documents" }; var app = WebApplication.Create(); app .UseStaticFiles() .UseStaticFiles(options); app.Run(); 按照上面这段程序指定的映射关系,对于存储在“~/doc/”目录下的这个PDF文件(checklist.pdf),请求URL采用的路径就应该是“/documents/checklist.pdf”。
阅读全文