首页 资讯 > > 正文

.netcore中的虚拟文件EmbeddedFile

来源:博客园 发布日期:2023-06-08 08:23:27 分享到:


(资料图片仅供参考)

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

关键词:

x 广告

河北印发出台通用机场布局规划(2021-2030年)

到2030年,全省形成以A类通用机场为主体、B类通用机场为补充,功能完善、覆盖广泛的通用机场体系,全省通用机场达到23个。其中,到2025年全

复原民国旧菜单 一批“消失的名菜”重现羊城

  中新网广州12月5日电 (记者 程景伟)“粤宴中国·消失的名菜”活动4日晚在广州博物馆镇海楼广场举行,一批业已失传或十分罕见的传统粤

青海再度“双清零”:战“疫”催生定点救治医院反思与成长

  中新网西宁12月5日电 题:青海再度“双清零”:战“疫”催生定点救治医院反思与成长  作者 潘雨洁  全面停诊、四下无人;火线冲

世界海拔最高高铁客运站山丹马场站运营

  中新网兰州12月5日电 (记者 杨艳敏)记者从中国铁路兰州局集团有限公司获悉,12月5日10时29分随着嘉峪关南至西安北D2696次动车组列车

千年古都洛阳为何要建青年友好型城市?

  中新网洛阳12月5日电 题:千年古都洛阳为何要建青年友好型城市?  记者 肖开霖 李贵刚  千年古都洛阳日前公布《洛阳市建设青年

甘肃万余河长公示牌拥有“电子身份证” 局地启“千里眼”治水

  中新网兰州12月5日电 (记者 冯志军)记者5日从甘肃省水利厅获悉,今年以来,甘肃全面推动河长公示牌信息化建设,为全省河流换发“电子

满洲里市向呼伦贝尔市“手递手”异地转运3批次隔离人员

  (抗击新冠肺炎)满洲里市向呼伦贝尔市“手递手”异地转运3批次隔离人员  中新网呼伦贝尔12月5日电 (记者 张玮)5日,内蒙古自治区呼

2021年度法治人物沈云如:让群众过上“有身份的生活”

  中新网杭州12月5日电 题:2021年度法治人物沈云如:让群众过上“有身份的生活”  作者 郭其钰 张先登  行程10余万公里,为辖区3

x 广告

Copyright   2015-2022 华东海洋网版权所有  备案号:京ICP备2022016840号-41   联系邮箱:2 913 236 @qq.com