以前一直比較好奇像swagger,cap,skywalking等組件是如何實作參考一個dll即可在網頁上展示界面的,難道這么多html,js,css等都是硬編碼寫死在代碼檔案中的?后面接觸apb里面也有虛擬檔案的功能,一直沒去深入了解,最近仔細看了一下他們的代碼,發現內部其實就是用嵌入式檔案(EmbeddedFile)來實作的,在專案中將html,css,js等檔案的屬性修改為“嵌入的資源”,
此時編譯后的dll就會包含這些資料檔案,生成的嵌入式檔案命名規則為:專案名稱.物理路徑1.物理路徑2...檔案名.擴展名,之后代碼中可以通過當前專案的Assembly.GetManifestResourceInfo方法獲取到這些檔案,通過Assembly.GetManifestResourceNames方法可以獲取到所有嵌入式資源
有了以上這些基礎,如果我們想對外提供這些嵌入式檔案的訪問,只需要創建一個中間件,將請求的url轉換成嵌入式資源的路徑,獲取對應的內容回傳即可,例如swagger,cap,skywalking等各類組件自帶的界面,就是在中間件中硬編碼了url和相關嵌入式資源檔案的映射關系,攔截到相關url后直接回傳嵌入式資源檔案,這樣發布的組件就只需要dll即可,不再需要其它html,css,js檔案了,
除了以上的自己通過中間件實作對嵌入式資源檔案的訪問外,.netcore中還內置了Microsoft.Extensions.FileProviders.EmbeddedFileProvider檔案提供器,在呼叫UseStaticFiles時可以指定檔案提供器,如下示例直接就可以對外提供這些嵌入式檔案的訪問了
app.UseStaticFiles(new StaticFileOptions() { FileProvider = new EmbeddedFileProvider(typeof(Program).Assembly) });
最后分享一個本人學習時寫的一個虛擬檔案系統,主要是參考學習了abp,swagger,.netcore的StaticFileMiddleware,其功能主要建立在UseStaticFiles之上,沒有另外單獨建立自己的中間件了,節約點代碼和中間件吧,另外重寫了EmbeddedFileProvider類,性能提升在4倍以上,具體使用方法參照VirtualFileSystem的readme
VirtualFileSystem: 虛擬檔案系統,可用于支持嵌入式檔案 (gitee.com)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/554652.html
標籤:ASP.NET
上一篇:C# 客戶端程式 Visual Studio 遠程除錯方法
下一篇:返回列表