ASP.NET Core中除了wwwroot外再添加自定义静态文件目录

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

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力