文章目錄
前言
以前使用.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. 總結
由於在公司的時候工作比較多並且繁瑣,文章更新的不頻繁,還是盡量堅持每周至少更新一批文章,寫文章不易 ,希望能夠幫助到園子里面的童鞋。喜歡的話可以點個贊和關注一波。