今天我們來了解了解ASP.NET Core中的靜態文件的處理方式.
以前我們寄宿在IIS中的時候,很多靜態文件的過濾 和相關的安全措施 都已經幫我們處理好了.
ASP.NET Core則不同,因為是跨平台的,解耦了IIS,所以這些工作 我們可以在管道代碼中處理.
在我們的Web程序開發中,肯定要提供很多的靜態文件(比如:JS,CSS)給客戶端下載使用.所以我們先來看看ASP.NET Core中是怎么處理的.
當我們創建一個ASP.NET Core MVC的模版程序后,會發現它與傳統的文件結構還是會有區別.
多了一個wwwroot文件夾,少了很多其他的資源文件夾.如圖:
我們點進去,就可以看到,微軟的模版,已經把所有的資源文件全放到了這里面,如圖:
這樣,項目就干凈了許多,下面,我們就來講講這個資源根目錄
1.提供靜態文件
我們到模版的Startup管道配置中,可以看到,注入相關靜態資源的代碼,已經幫我們寫好了,如圖:
這句話就是注入靜態資源用的,默認會將wwwroot的資源直接配置的和根目錄一樣,來方便訪問.
訪問資源的URL類似: "http://localhost:9189/images/banner3.svg" 這樣.
那么問題來了,我們能不能自己配置這個靜態資源呢?.
當然是可以的~.
我們在項目中創建文件夾如下:
然后通過StaticFileOptions注入靜態資源的配置,代碼如下:
app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), @"StaticFiles")), RequestPath = new PathString("/StaticFiles") });
注意:這里的2個StaticFiles, 第一個是你的本地資源路徑,第二個是你需要配置的URL路徑,URL路徑可以自己定義,這樣可以一定程度上保護自己的資源安全.
然后我們通過URL訪問效果如下:
在StaticFileOptions
中,我們還可以通過OnPrepareResponse屬性配置我們的響應頭,添加 代碼如下:
app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), @"StaticFiles")), RequestPath = new PathString("/StaticFiles"), OnPrepareResponse = ctx => { ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=600"); } });
這里,我們設置http響應緩存為600秒.
(小知識:max-age:表示當訪問此網頁后的max-age秒內再次訪問不會去服務器請求,其功能與Expires類似,只是Expires是根據某個特定日期值做比較。一但緩存者自身的時間不准確.則結果可能就是錯誤的,而max-age,顯然無此問題.。Max-age的優先級也是高於Expires的。)
效果如下:
這樣,我們就可以根據需求來配置自己的靜態文件緩存和其他的響應頭信息.
2.啟用靜態文件目錄瀏覽
開啟靜態文件目錄瀏覽..其實是一件安全性級低的事情,不管是傳統的asp.net還是asp.net core 默認都是關閉了這個功能.
但是,不排除我們會用到.在asp.net中,我們只需要的Web.config中配置即可.
下面我們就來講講如何在asp.net core 中啟用我們的靜態文件目錄游覽
開啟靜態文件目錄游覽需要使用UseDirectoryBrowser來注入配置,代碼如下:
app.UseDirectoryBrowser(new DirectoryBrowserOptions() { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), @"StaticFiles")), RequestPath = new PathString("/MyStaticFiles") });
這里,我特意改了URL的訪問路徑.為MyStaticFiles..我們來看看效果:
我們點擊里面任意一個文件,會發現.返回404.因為路徑是
所以,這里需要和上面的文件URL路徑一致,才可以訪問的到文件.(這樣其實提供了一種比較安全的配置手段.可以隱藏自己本機的真實路徑)
3.使用UseFileServer合成的注入方法~簡化代碼.
按照我們上面的配置,如果開啟了文件和目錄游覽,就會發現寫了不少注入代碼,如下:
這樣不是很方便,也不利於后期的維護.那么,下面我們就來簡化他~
UseFileServer的
功能結合了UseStaticFiles
,UseDefaultFiles
和UseDirectoryBrowser
。
我們把上面的代碼全部注釋.並修改代碼如下:
app.UseFileServer(new FileServerOptions() { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), @"StaticFiles")), RequestPath = new PathString("/StaticFiles"), EnableDirectoryBrowsing = true });
效果如下:
這里,注意EnableDirectoryBrowsing屬性,就是是否啟用目錄的屬性.
4.ASP.NET Core中使用MIME內容類型來過濾靜態文件返回.
上篇文章我們提到過.需要使用
FileExtensionContentTypeProvider
這個類.具體使用方法,直接new一個即可,里面包含了300多種已知的文件類型,如下:
為什么這里我們要提到這個呢.因為他可以幫我們過濾一些不想讓客戶端訪問的文件類型.如下:
這里要注意,使用FileExtensionContentTypeProvider,只能通過UseStaticFiles,不能使用UseFileServer
因為ContentTypeProvider是StaticFileOptions(靜態文件選項)的配置內容,在FileServerOptions中並沒有.
上面的代碼,我們刪除了png格式文件.也就是不返回這個內容的文件.運行后效果如下:
我們訪問我們的gif格式的文件,效果如下:
還是可以正常訪問的.對於一些安全性較高,或者涉及文件類型較多的功能來說.還是比較實用的.可以自己過濾掉一些敏感類型.比如exe.
好了,本篇到此就結束了~歡迎大家批評指正~喜歡或者覺得有用的話 就關注一下 點個推薦..謝謝~