本文章介绍在 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") 显示设置默认文件
评论