本文章介绍在 ASP.NET Core 中的静态文件
默认情况下静态文件是 ASP.NET Core 应用直接提供给客户端的资源
先决条件
.NET SDK
介绍
静态文件存储在项目的 Web 根目录中。 默认目录为 {content root}/wwwroot,但可通过 UseWebRoot 方法更改目录
静态文件中间件
在 ASP.NET Core 中,要访问静态文件资源需要用 IApplicationBuilder.UseStaticFiles() 方法配置静态文件中间件,在静态文件中间件中由 PhysicalFileProvider 进行文件的管理
Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(builder => builder.Configure(app => app.UseStaticFiles() ) ).Build().Run();
复制代码
默认的无参情况下,URL 的基地址被映射到了 wwwroot 目录文件夹
还能显示定义 URL 和 磁盘目录文件夹的关系
var path = Path.Combine(Directory.GetCurrentDirectory(), "content"); var options = new StaticFileOptions { FileProvider = new PhysicalFileProvider(path), RequestPath = "/content" }; Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(builder => builder.Configure(app => app.UseStaticFiles(options) ) ).Build().Run();
复制代码
在上面这段代码中,将当前程序目录下的 content 目录与 http://localhost:*/content/ 进行映射
当然,配置多个静态文件中间件也是允许的
静态文件中间件中还可以显示指定 内容类型,就是 HTTP 的 content-type
我们可以指定凡事无法识别的文件,一律识别为某一种类型
var options = new StaticFileOptions { ServeUnknownFileTypes = true, DefaultContentType = "image/jpg" }; Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(builder => builder.Configure(app => app.UseStaticFiles(options) .UseDirectoryBrowser() ) ).Build() .Run();
复制代码
在上面代码中,将无法识别的文件响应的 content-type 一律指定为 image/jpg
还可以对指定类型的文件指定对应的 内容类型
var contentTypeProvider = new FileExtensionContentTypeProvider(); contentTypeProvider.Mappings.Add(".abc", "image/jpg"); var options = new StaticFileOptions { ContentTypeProvider = contentTypeProvider };
Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(builder => builder.Configure(app => app.UseStaticFiles(options) .UseDirectoryBrowser() ) ).Build() .Run();
复制代码
在上面代码中,我们指定将尾缀名为 abc 文件的文件指定响应的 content-type 为 image/jpg,使浏览器拿到文件时,以 jpg 图片的格式来解析文件
目录浏览中间件
要浏览静态文件目录需要用 IApplicationBuilder.UseDirectoryBrowser() 方法配置目录浏览中间件
Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(builder => builder.Configure(app => { app.UseDirectoryBrowser() .UseStaticFiles(); }) ).Build() .Run();
复制代码
一般需要用到 目录浏览中间件 时,都会用到 静态文件中间件
上面这例子中实现了对 wwwroot 的文件目录的浏览功能
也能够像静态文件中间件一样显示定义 URL 和 磁盘目录文件夹的关系
var path = Path.Combine(Directory.GetCurrentDirectory(), "content"); var staticFileOptions = new StaticFileOptions { FileProvider = new PhysicalFileProvider(path), RequestPath = "/content" }; var directoryBrowserOptions = new DirectoryBrowserOptions { FileProvider = new PhysicalFileProvider(path), RequestPath = "/content" }; Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(builder => builder.Configure( app => app .UseStaticFiles() .UseStaticFiles(staticFileOptions) .UseDirectoryBrowser() .UseDirectoryBrowser(directoryBrowserOptions) ) ).Build() .Run();
复制代码
在上面这段代码中,将当前程序目录下的 wwwroot 和 http://localhost:*/ 进行映射
content 目录与 http://localhost:*/content/ 进行映射
默认页面中间件
默认静态页面中间件使用 IApplicationBuilder.UseDefaultFiles() 方法配置
其中默认的默认页面有 "default.htm","default.html","index.htm","index.html" 一共四个
默认页面中间件一定需要和静态文件中间件一起使用,
因为默认页面中间件其实是对 url 的重写,具体响应还是静态文件中间件
默认页面中间件必须在静态文件中间件和目录浏览中间件之前,否则将无法发挥作用
var path = Path.Combine(Directory.GetCurrentDirectory(), "content"); var fileProvider = new PhysicalFileProvider(path); var staticFileOptions = new StaticFileOptions { FileProvider = fileProvider, RequestPath = "/content" }; var directoryBrowserOptions = new DirectoryBrowserOptions { FileProvider = fileProvider, RequestPath = "/content" }; var defaultFilesOptions = new DefaultFilesOptions { FileProvider = fileProvider, RequestPath = "/content" }; defaultFilesOptions.DefaultFileNames.Add("readme.html"); Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(builder => builder.Configure(app => app.UseDefaultFiles() .UseDefaultFiles(defaultFilesOptions) .UseStaticFiles() .UseStaticFiles(staticFileOptions) .UseDirectoryBrowser() .UseDirectoryBrowser(directoryBrowserOptions) ) ).Build() .Run();
复制代码
上面这个示例中,还使用 DefaultFilesOptions.DefaultFileNames.Add("readme.html") 显示设置默认文件
评论