静态文件,比如HTML,CSS,JavaScript和图片之类的资源,是ASP.NET Core应用可以直接提供给客户端的。

静态文件服务

静态文件通常位于web root(<content-root>/wwwroot)文件夹。通常会把项目当前目录设置为Content Root,这样项目的web root就可以在开发阶段被确定。

public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

静态文件可以被保存在web root根目录下的任意文件夹内,并通过相对根目录路径来访问。比如在wwwroot文件夹下包含css,imagesjs文件夹。可以通过如下URL来访问images子文件夹里面的图片:

  • http://\<app>/images/\<imageFileName>
  • http://localhost:9189/images/banner3.svg

为了能够启用静态文件服务,你必须配置中间件来添加静态文件到管道中。静态文件中间件通过这种方式来进行配置:在项目中添加Microsoft.AspNetCore.StaticFiles包依赖,然后在Startup.Configure方法内调用UseStaticFiles扩展方法。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseStaticFiles();
}

app.UseStaticFiles();使得位于web root(默认为wwwroot)下的文件可被访问。web root的默认目录是wwwroot,但可以通过UseWebRoot来设置web root

静态文件授权

静态文件模块无需验证检查,任何通过该服务提供的文件,包含那些在wwwroot文件夹中的文件都是公开可被访问的。如果需要对文件访问需要进行授权:

  • 将文件存储在wwwroot文件夹和任何可通过静态文件中间件能访问以外的地方。并且
  • 通过一个控制器动作方法访问它们,获得授权后返回一个FileResult

启用目录浏览

目录浏览允许你网站的用户去查看指定目录下的目录和文件列表。出于安全考虑,目录浏览功能默认是不可用的。在Startup.Configure方法中调用UseDirectoryBrowser扩展方法以启用目录浏览:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseStaticFiles(); // For the wwwroot folder

    app.UseStaticFiles(new StaticFileOptions()
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot", "images")),
        RequestPath = new PathString("/MyImages")
    });

    app.UseDirectoryBrowser(new DirectoryBrowserOptions()
    {
        FileProvider = new PhysicalFileProvider(
                    Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot", "images")),
        RequestPath = new PathString("/MyImages")
    });
}

通过在Startup.ConfigureServices方法中调用AddDirectoryBrowser扩展方法添加需要的服务:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDirectoryBrowser();
}

上述代码允许通过http://\<app>/MyImagesURL对wwwroot/images文件夹进行目录浏览:

下述代码中,有两个app.UseStaticFiles();方法调用。第一个是访问wwwroot文件夹中的CSS、图片、javaScript文件所必需的,第二个是用于通过http://\<app>/MyImagesURL对wwwroot/images进行目录浏览:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseStaticFiles(); // For the wwwroot folder

    app.UseStaticFiles(new StaticFileOptions()
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\images")),
        RequestPath = new PathString("/MyImages")
    });

    app.UseDirectoryBrowser(new DirectoryBrowserOptions()
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\images")),
        RequestPath = new PathString("/MyImages")
    });
}

默认文档服务

为了提供默认页面使你的网站能让用户无需输入完整的URL,可以通过在Startup.Configure方法中调用UseDefaultFiles扩展方法。

public void Configure(IApplicationBuilder app)
{
    app.UseDefaultFiles();
    app.UseStaticFiles();
}

UseDefaultFiles必须在UseStaticFiles方法之前进行调用以提供默认页面。UseDefaultFiles实际是一个URL重写,而不是一个真的提供了一样一个文件。你必须启用静态文件中间件(UseStaticFiles)来提供文件服务。

使用UseDefaultFiles,请求到来的时候将会搜索:

  • default.htm
  • default.html
  • index.htm
  • index.html

列表中第一个被找到的文件将作为一个完整的URL请求被提供服务。

UseFileServer

UseFileServerUseStaticFiles,UseDefaultFiles,UseDirectoryBrowser功能的组合。

下面代码启用了静态文件和默认文件,但不允许直接访问目录:

app.UseFileServer();

下面的代码启用了静态文件、默认文件和目录浏览功能:

app.UseFileServer(enableDirectoryBrowsing: true);

FileExtensionContentTypeProvider

FileExtensionContentTypeProvider类包含一个映射文件扩展名到MIME内容类型的集合。下面的例子中,多个文件的扩展中被注册成已知的MIME类型,其中”.rtf”被代替,”.mp4”被删除。

public void Configure(IApplicationBuilder app)
{
    // Set up custom content types -associating file extension to MIME type
    var provider = new FileExtensionContentTypeProvider();
    // Add new mappings
    provider.Mappings[".myapp"] = "application/x-msdownload";
    provider.Mappings[".htm3"] = "text/html";
    provider.Mappings[".image"] = "image/png";
    // Replace an existing mapping
    provider.Mappings[".rtf"] = "application/x-msdownload";
    // Remove MP4 videos.
    provider.Mappings.Remove(".mp4");

    app.UseStaticFiles(new StaticFileOptions()
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\images")),
        RequestPath = new PathString("/MyImages"),
        ContentTypeProvider = provider
    });

    app.UseDirectoryBrowser(new DirectoryBrowserOptions()
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\images")),
        RequestPath = new PathString("/MyImages")
    });
}

原文链接

Working with Static Files

个人博客

我的个人博客