关于 ASP.NET Core 中的静态文件


前言

当前文章用的 .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-typeimage/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") 显示设置默认文件。

猜你喜欢

转载自blog.csdn.net/Upgrader/article/details/112598708