AspNet Core中靜態文件、目錄瀏覽詳解


前言

以前使用.Net Framwork部署web時需要IIS進行部署 ,在IIS中的虛擬目錄、默認文檔、MIME、、等等都是已經幫我們處理好了,但是在aspnet core中需要我們自處理,框架自帶為我們提供了幾個中間件 ,需要在請求管道中自行進行處理過濾等。
下面我將詳細的介紹框架自帶的幾個靜態文件、目錄文檔中間件。

1. wwwroot

aspnet core提供的mvc、razorpage、webapi模板都是可以用來開發web項目的,那么細心的童鞋會注意到項目結構中新建wwwroot文件夾會自動映射成這樣的結構。在這里插入圖片描述
這是框架中默認wwwroot為靜態文件虛擬目錄文件夾,內部可以存放js、css、html、image等等常用文件。

2. UseStaticFiles()注冊靜態文件中間件

2.1 框架自帶靜態文件

從下圖中可以看到UseStaticFiles方法件默認有三個重載,下面會進行一一嘗試 。
在這里插入圖片描述
當我們沒有注冊靜態文件中間件時並不能訪問wwwroot文件夾下的文件。
在這里插入圖片描述
Configure方法中注冊靜態文件中間件。

app.UseStaticFiles();

這時就可以正常訪問了。
在這里插入圖片描述

2.1 自定義靜態文件

在某些業務場景中我們可能需要自建立靜態文件的路徑,例如上傳文件需要自己建立的文件夾來進行存儲等。
這時就需要使用到UseStaticFiles另外兩個重載方法。

app.UseStaticFiles(new StaticFileOptions
{
    RequestPath = new Microsoft.AspNetCore.Http.PathString("/file"),
    ServeUnknownFileTypes = true,
    //這里需要傳遞絕對路徑
    //FileProvider = new PhysicalFileProvider("files")
    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "files"))
});

StaticFileOptions常用屬性解釋:

  • RequestPath:請求的路徑,一定是絕對路徑 /
  • ServeUnknownFileTypes:支持未知的文件類型
  • FileProvider:文件路徑,一定是絕對路徑
  • OnPrepareResponse:這是一個Action<StaticFileResponseContext>委托,可以對HttpContext做自己的相關處理

我們新建一個files文件夾用來存放自己的文件。
在這里插入圖片描述
這時我們測試訪問 https://localhost:5001/file/特殊文件不能訪問.png

下面的截圖不要搞混淆了,我這里順帶一起解釋了ServeUnknownFileTypes,訪問上面的地址會訪問到我測試了沒有設置ServeUnknownFileTypes的時候訪問Dockerfile文件出現的404截圖。
在這里插入圖片描述
設置ServeUnknownFileTypes=true能正常訪問未支持的文件了。

設置RequestPath可以對內的文件夾目錄做一個封閉,這樣能夠不暴露內部的目錄結構。

上面這樣的靜態文件這樣暴露出來對於使用者來說根本不知道路徑是怎樣的,接下來會引入另外一個瀏覽器目錄中間件

3. UseDirectoryBrowser()注冊目錄結構中間件

3.1 默認目錄結構

注靜態文件、目錄結構中間件

app.UseStaticFiles();
app.UseDirectoryBrowser();

這時我們可以看到wwwroot文件夾下的靜態文件,這樣能夠很方便的給使用者一目了然的知道靜態文件的結構是怎樣的。

注意:這里使用默認的目錄結構只會顯示出wwwroot下的靜態文件,並沒有顯示出上面提及的files下的靜態文件。

在這里插入圖片描述

3.2 自定義開放目錄結構

有時候並不會將wwwroot下的所有目錄展示出來,可以自行定義展示的目錄,例如只展示html文件夾的文件。

app.UseStaticFiles();
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/html"))
});

在這里插入圖片描述

注意:這里只是目錄結構的展示進行了約束,其他靜態文件照樣是可以訪問的。

3.3 靜態文件和目錄配合使用

我們指定展示上面介紹的自定義文件。

app.UseStaticFiles(new StaticFileOptions
{
    RequestPath = new Microsoft.AspNetCore.Http.PathString("/file"),
    ServeUnknownFileTypes = true,
    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "files"))
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "files")),
    RequestPath = new Microsoft.AspNetCore.Http.PathString("/file")
});

在這里插入圖片描述
這時點擊靜態文件就能夠進行正常訪問了,仔細的童鞋應該發現了我們的靜態文件、目錄都是指定的同一個路徑和訪問地址,經過我測試了要是請求地址沒有進行統一的話會照樣訪問不到的,想道理也能夠明白,目錄結構的訪問路徑肯定要和請求路徑統一。

那么這樣是不是覺得很麻煩呢????

4. UseFileServer()融合靜態文件、目錄結構

注冊融合靜態文件、目錄結構中間件。

app.UseFileServer(true);

這時照樣能夠正常的訪問,這里不設置EnableDirectoryBrowsing=true也還是不會展示目錄結構的。
``在這里插入圖片描述

4.1 默認文檔

設置EnableDefaultFiles是否啟用默認文檔,例如訪問 **https://localhost:5001/html/**時自動采用了index.html,我猜想這里的默認文檔應該和iis中設置的默認文檔是一個意思。

app.UseFileServer(new FileServerOptions
{
    EnableDefaultFiles=true,
    EnableDirectoryBrowsing=true
});

注意:當啟用了默認文檔時在展示目錄結構的時候並不會定位到和默認文檔同級文件夾下的內容。

例如直接點擊html時並不會展示html文件夾下的目錄結構,而是直接訪問了默認文檔。根據自己的使用場景可以自定決定是否開啟默認文檔。
在這里插入圖片描述

5. 總結

由於在公司的時候工作比較多並且繁瑣,文章更新的不頻繁,還是盡量堅持每周至少更新一批文章,寫文章不易 ,希望能夠幫助到園子里面的童鞋。喜歡的話可以點個贊和關注一波。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM