2021-09-29 乐帮网
web netcore
在ASP.NET Core中静态文件存储在项目的 Web 根目录中。 默认目录为 {content root}/wwwroot,我们可以直接通过根目录来直接访问静态文件。一般主程序的配置里会有下面一段:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
});
}
其中app.UseStaticFiles();就是启用以上默认规则的语句,如果我要修改以上目录,那么可以这么改一下:
// using Microsoft.Extensions.FileProviders;
// using System.IO;
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.ContentRootPath, "MyStaticFiles")),
RequestPath = "/StaticFiles"
});
除此之外我们还可以为静态文件设置 HTTP 响应标头,请使用以下代码:
const string cacheMaxAge = "604800";
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = ctx =>
{
// using Microsoft.AspNetCore.Http;
ctx.Context.Response.Headers.Append(
"Cache-Control", $"public, max-age={cacheMaxAge}");
}
});
关于静态文件的访问授权我想说的可以通过控制Controller来实现例如以下代码:
[Authorize]
public IActionResult BannerImage()
{
var filePath = Path.Combine(
_env.ContentRootPath, "MyStaticFiles", "images", "red-rose.jpg");
return PhysicalFile(filePath, "image/jpeg");
}
也可以通过过滤器来实现,参考我之前的文章:https://lebang2020.cn/details/210526gosd515q.html
另外扩展知识,目录浏览功能在这里:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddDirectoryBrowser();
}
同时需要提供多个目录时,我们应该怎么办?首先wwwroot是带参数的方法
app.UseStaticFiles(); //默认添加wwwroot lebang2020.cn
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "resource")),
RequestPath = "/resource"
});
我们可以添加多条记录来扩展路径:
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "resource")),
RequestPath = "/resource"
});
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "settings")),
RequestPath = "/settings"
});
写在最后,不要忘记把目录里的内容设置成发布复制,否则发布的时候是不会被复制到发布目录的,这点十分重要。
参考文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/static-files?view=aspnetcore-5.0
关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com
庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力