.netcore中的虛擬文件EmbeddedFile

以前一直比較好奇像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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章