《ASP.NET Core 高性能系列》靜態文件中間件

1、概述

  靜態文件(如 HTML、CSS、圖片和 JavaScript等文件)是 Web程序直接提供給客戶端的直接加載的文件。 較比於程序動態交互的代碼而言,其實原理都同樣(走Http協議),css

ASP.NET Core中須要進行一些配置才能提供這些文件。html

2、wwwroot

  靜態文件存儲在項目的 Web 程序的 {ContentRoot}/wwwroot目錄下,但可經過 UseWebRoot 方法更改路徑 。 前端

Web 應用程序項目的 wwwroot 文件夾中默認有多個文件夾 :後端

  • wwwroot
    • css
    • images
    • js

用於訪問 images 子文件夾中的文件的 URI 格式爲 http://<server_address>/images/<image_file_name> 。 例如, http://localhost:1189/images/banner.pngapi

  經過如下代碼開啓靜態文件訪問功能(設置 {ContentRoot}/wwwroot爲默認的靜態文件工做目錄)瀏覽器

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

3、設置指定目錄爲靜態文件工做目錄

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(); //   wwwroot 目錄

    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "the_path_to_yours")),
        RequestPath = "/GiveAName"
    });
}

  注意訪問自定義的靜態文件路徑發生變化:http://localhost:1189/GiveAName/images/banner.png緩存

4、給靜態文件添加客戶端緩存

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    var cachePeriod = env.Production() ? "60000" : "600";
    app.UseStaticFiles(new StaticFileOptions
    {
        OnPrepareResponse = ctx =>
        {
            // 記得下面的引用:
            // using Microsoft.AspNetCore.Http;
            ctx.Context.Response.Headers.Append("Cache-Control", $"public, max-age={cachePeriod}");
        }
    });
}

  如上,在生產環境中,咱們給靜態文件添加了60000(ms)的緩存,即:在一分鐘內,客戶端都會從瀏覽器本地拿文件,注意此手法,直接更新靜態文件一時間是拿不到最新文件的.安全

 

 

5、利用PhysicalFile方法讓靜態文件的訪問能夠進行鑑權

  靜態文件中間件容許瀏覽器端訪問由靜態文件中間件提供的全部靜態文件(包括 wwwroot 下的文件),咱們設想實際的一個應用場景,咱們上傳了一個文件到指定目錄,而這個文件只能當事人本身能夠進行訪問,那麼如何進行權限驗證呢?app

[Authorize]//身份驗證
public IActionResult UsersOwnPictrue()
{
    var file = Path.Combine(Directory.GetCurrentDirectory(), 
                            "StaticFilesPath", "images", "my.svg");
    return PhysicalFile(file, "image/svg+xml");//返回靜態文件
}

6、先後端分離開發中的使用

  先後端開發分離的開發模式中,前端本身負責前端的一切交互工做,不只如此還會在後端工做沒有啓動前本身構造數據,ASP.NET Core靜態文件中間件,正好可和此開發前後端分離

模式進行銜接,此處省略一萬字,有一點你們比較關心的問題:如何設置項目起始頁,如何設置前端項目中的默認頁

public void Configure(IApplicationBuilder app)
{
    app.UseDefaultFiles();//必須在  前調用 。  實際上用於重寫 URL,不提供文件。 app.UseStaticFiles(); //這兩步
}UseStaticFilesUseDefaultFilesUseDefaultFiles
使用 UseDefaultFiles 會使用如下這些文件做爲整個項目的默認起始頁:
default.htm
default.html
index.htm
index.html
public void Configure(IApplicationBuilder app)
{
    // 使用其餘文件做爲默認靜態頁面文件
    DefaultFilesOptions options = new DefaultFilesOptions();
    options.DefaultFileNames.Clear();
    options.DefaultFileNames.Add("其餘wwwroot下的.html");
    app.UseDefaultFiles(options);
    app.UseStaticFiles();
}

 

app.UseFileServer();//可將上面兩步何爲一步

 

7、關於UseFileServer

  UseFileServer 整合了 UseStaticFiles、UseDefaultFiles 和 UseDirectoryBrowser(可選,若是啓用須要services.AddDirectoryBrowser())的功能,

public void Configure(IApplicationBuilder app)
{
   
    app.UseFileServer(new FileServerOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "文件夾")),
        RequestPath = "/請求名",
        EnableDirectoryBrowsing = true
    });
}
請求鏈接 對應路徑
http://<server_address>/請求名/images/file1.png 文件夾/images/file1.png
http://<server_address>/請求名/ 文件夾/default.html

8、開啓目錄瀏覽功能

  此功能一般不要開啓,由於比較危險,經過目錄瀏覽,Web 應用的用戶可查看目錄列表和指定目錄中的文件。 出於安全考慮,調用 Startup.Configure 中的 UseDirectoryBrowser 方法來啓用目錄瀏覽:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDirectoryBrowser();
}
 app.UseDirectoryBrowser(new DirectoryBrowserOptions //開啓對wwwroot/images的文件進行瀏覽的功能
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
        RequestPath = "/MyImages"
    });

9、指定指定文件類型的MIME類型

public void Configure(IApplicationBuilder app)
{

    var provider = new FileExtensionContentTypeProvider();

    provider.Mappings[".rtf"] = "application/x-msdownload";
    // 移除指定文件的解析
    provider.Mappings.Remove(".mp4");
    ......
}
public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(new StaticFileOptions
    {
       //未知類型的ContentType
        ServeUnknownFileTypes = true,
        DefaultContentType = "bala/your type"
    });
}
相關文章
相關標籤/搜索