1. 程式人生 > 其它 >關於 ASP.NET Core 中的靜態檔案

關於 ASP.NET Core 中的靜態檔案

技術標籤:.NET CoreASP.NET CoreASP.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") 顯示設定預設檔案。