前言
当前文章用的 .NET Core SDK 3.1
一、静态文件中间件
在 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")
显示设置默认文件。