使用 Minimal API 改造动态文件提供者

使用 Minimal API 改造动态文件提供者

Intro

之前介绍过一个基于动态文件提供者来实现静态网站的动态更新,可以参考 ASP.NET Core 实现一个简单的静态网站滚动更新,在 Minimal API 出现之后想改造成 Minimal API 的写法,但是由于之前版本的 Minimal API 有点问题,Configuration Reload 的时候没有生效,所以没有使用 Minimal API 的形式,在 .NET 6 Preview 6 中这个问题被修复了,所以最近把这个应用使用 Minimal API 改造了一下

Issue

之前的版本中 Minimal API 存在的问题是这样的,当我们在应用中对 Configuration 进行 Reload 的时候,并不会触发配置变化,详细可以参考这个 issue:https://github.com/dotnet/aspnetcore/issues/34056

为了方便重现,我也写了一个简单的示例来重现这个问题(需要 .NET 6 Preview 4/5),有需要的童鞋可以参考

https://github.com/WeihanLi/AspNetCorePlayground/tree/master/MinimalAPIConfigurationIssue

Minimal API

之前的代码也使用了 C# 9 的新特性去掉了 Main 已经比较简洁了

var builder = Host.CreateDefaultBuilder(args);
builder.ConfigureWebHostDefaults(webHostBuilder =>
{webHostBuilder.ConfigureServices((context, services) =>{services.Configure<DynamicFileProviderOptions>(context.Configuration);services.AddSingleton<DynamicFileProvider>();});webHostBuilder.Configure(app =>{app.Map(new PathString("/redeploy"), appBuilder => appBuilder.Run(context =>{if (context.RequestServices.GetRequiredService<IConfiguration>() is ConfigurationRoot configuration){var currentSlot = configuration["CurrentSlot"];configuration["CurrentSlot"] = "Slot2" != currentSlot ? "Slot2" : "Slot1";configuration.Reload();return context.Response.WriteAsync("Success");}return Task.CompletedTask;}));var dynamicFileProvider = app.ApplicationServices.GetRequiredService<DynamicFileProvider>();app.UseStaticFiles(new StaticFileOptions(){FileProvider = dynamicFileProvider,});});
});
var host = builder.Build();
host.Run();

使用 Minimal API 之后,代码更加简洁,代码量减少到原来代码量的一半左右,改造后的代码如下:

var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<DynamicFileProviderOptions>(builder.Configuration);
builder.Services.AddSingleton<DynamicFileProvider>();
var app = builder.Build();
app.Map(new PathString("/redeploy"), appBuilder => appBuilder.Run(context =>
{if (context.RequestServices.GetRequiredService<IConfiguration>() is IConfigurationRoot configuration){var currentSlot = configuration["CurrentSlot"];configuration["CurrentSlot"] = "Slot2" != currentSlot ? "Slot2" : "Slot1";configuration.Reload();return context.Response.WriteAsync("Success");}return Task.CompletedTask;
}));
var dynamicFileProvider = app.Services.GetRequiredService<DynamicFileProvider>();
app.UseStaticFiles(new StaticFileOptions {FileProvider = dynamicFileProvider});
app.Run();

实际运行效果和原来一样

More

目前的实现感觉还是有一些复杂的,现在有两个 Configuration 对象,一个是属于 Host 构建过程中的,另外一个是应用实际运行过程中用到的,现在的解决方式相当于是给应用 Configuration 加了 callback 以触发 Host 构建过程中的 Configuration,后续也会继续优化使用 ChainedConfigurationSource 来简化当前的做法,可以参考:https://github.com/dotnet/aspnetcore/issues/34056#issuecomment-881038203

现在我们还手动引用了命名空间,结合此前介绍的隐式命名空间引用特性 .NET 6 即将到来的新特性 — 隐式命名空间引用 ,我们将可以移除命名空间引用,进一步精简我们的代码

References

  • https://github.com/WeihanLi/SamplesInPractice/tree/master/DynamicStaticFileProvider

  • https://github.com/dotnet/aspnetcore/issues/34056

  • https://github.com/dotnet/aspnetcore/pull/33081

  • https://github.com/WeihanLi/AspNetCorePlayground/tree/master/MinimalAPIConfigurationIssue

  • https://github.com/dotnet/aspnetcore/compare/v6.0.0-preview.5.21301.17...v6.0.0-preview.6.21355.2#diff-64b273cd414609b9e4c6b0f7d1135735073283603825b1d2c19480357b0206c5R89

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[导入]体验Asp.Net Mvc Preview5(3)-探索ModelBinder的工作原理

摘要: 在前面的两篇文章中,我们研究了Asp.Net Mvc Preview5的ViewEingine的改进,从本篇开始,我们开始研究Preview5中的新特性:ModelBinder,首先我们来了解下什么是ModelBinder特性,这有什么用处,在以前的版本中,如果我们要在Action中获取数据,一般有三种方式,一是通过Action的参…

复盘:我的三个月远程办公实践,有自由,也有代价

这是头哥侃码的第244篇原创有人说&#xff0c;人生就是一个不断尝试的过程。我觉得&#xff0c;有时候这个词其实不准确&#xff0c;因为每个人的性格不同&#xff0c;成长经历及运势不同&#xff0c;所以对 “尝试” 俩字的理解也就不同。在我还是孩子的时候&#xff0c;几乎所…

Silverlight专题(10)- WatermarkedTextBox使用

问题&#xff1a; 之前的Silverlight版本都有一个WatermarkedTextBox控件 但是到了Silverlight 2 Beta2版本&#xff0c;由于和WPF兼容的考虑 WatermarkedTextBox被移除了 虽然之前我有看到消息说Silverlight 2正式Release的时候会给TextBox一个Watermark属性 但是Silverlight …

90后一代人还能通过攒钱改变现状吗?

全世界只有3.14 % 的人关注了青少年数学之旅每次打开公号&#xff0c;扑面而来一阵阵焦虑&#xff1a;95后毕业3个月就买房&#xff0c;你的同龄人正在抛弃你毕业3年&#xff0c;年薪超100万&#xff1a;赚钱&#xff0c;是一种修行一线城市财务自由门槛2.9亿&#xff0c;看看你…

从高德侯军到《李嘉诚:商者无域》

从高德侯军到《李嘉诚&#xff1a;商者无域》 【编者按】转载这篇文章是因为看到了业内著名企业高德董事长侯军跻身2008胡润排行榜&#xff0c;让人不禁联想起高德在业内一贯的潜行风格&#xff0c;而侯军先生也颇有点“忍者神龟”的隐喻&#xff0c;在业内企业家当中属闷声发大…

测试龙芯 LoongArch .NET之 使用 FastTunnel 做内网穿透远程计算机

龙芯3A5000 已经上市&#xff0c;从老伙计哪里搞来一台3A5000 机器&#xff0c;安装统信UOS。使用体验上看还可以&#xff0c;就是软件生态急需建设&#xff0c;软件生态的建设上自然有我dotnet 的一份力量。龙芯团队已经完成了LoongArch 的.NET Core 3.1版本的研发&#xff0c…

利用jquery给指定的table动态添加一行、删除一行

今天在项目中&#xff0c;刚好用到给指定的table添加一行、删除一行&#xff0c;就直接找google&#xff0c;搜出来的东西不尽如人意&#xff0c;不是功能不好就是千篇一律&#xff0c;简直浪费时间还不讨好&#xff0c;于是乎就自己动手封装个&#xff0c;现就把代码分享出来&…

求求你把输入法调小一点... | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅

linux安装卷管理,Linux安装管理ISCSI卷(initiator端)

Internet SCSI(iSCSI)是一种网络协议&#xff0c;使用TCP/IP网络来传输SCSI协议。它是代替FC(Fibre Channel-based&#xff0c;光纤通道&#xff1f;) SAN的很好选Internet SCSI(iSCSI)是一种网络协议&#xff0c;使用TCP/IP网络来传输SCSI协议。它是代替FC(Fibre Channel-base…

Blazor 事件处理开发指南

翻译自 Waqas Anwar 2021年3月25日的文章 《A Developer’s Guide To Blazor Event Handling》 [1]如果您正在开发交互式 Web 应用程序&#xff0c;根据不同的应用程序事件和用户操作动态更新用户界面是十分常见的做法。这些操作会触发事件&#xff0c;而作为开发人员&#xff…

android 开源组件合集-UI篇(2013-11-07更新)

其实也算不上合集,只是将我经常用到的部分整理一下,如果您有好东西,也可以留言补充 1.actionbar http://actionbarsherlock.com/ https://github.com/JakeWharton/ActionBarSherlock (推荐) 2.下拉刷新pulltorefresh https://github.com/chrisbanes/Android-PullToRefresh 支持…

改变世界的5大常数,学过数学的人,这一辈子都不会忘记!

全世界只有3.14 % 的人关注了青少年数学之旅何谓数学&#xff1f;数学家Eduardo曾这样回答“数学是永恒&#xff0c;是真理&#xff0c;是一切的答案。”回首往昔数学始终伴随我们左右纵横交错的几何、繁琐复杂的运算难以求解的方程、无从下手的猜想......尽管在数学道路上有多…

创维linux进入工厂模式,创维电视怎么进入工厂模式?

满意答案zrwemshwt54推荐于 2019.11.03创维彩电进入与退出工厂模式方法的汇总一&#xff0e; D系列5D01机芯&#xff1a;进入&#xff1a;在遥控器屏显键的正下方&#xff0c;加装一个按键(SERVICE键)&#xff0c;按该键即可进入工厂模式。退出&#xff1a; 按遥控器上的TV/AV键…

收到在微软商店购买的商品

今天收到了在微软商店购买的商品&#xff0c;送货速度真快&#xff0c;20号下的订单&#xff0c;今天就拿到了&#xff0c;这么快就从美国通过UPS快递到国内&#xff0c;现在的物流越来越发达了。我购买的商品是&#xff1a;1、WM USB Powered Speakers(USB扬声器)2、LifeCam V…

[导入]纹理拼接后的Wrap寻址

拼接后的纹理:正常的草地(不进行WRAP寻址):文章来源:http://blog.csdn.net/xoyojank/archive/2008/11/03/3212425.aspx转载于:https://www.cnblogs.com/xoyojank/archive/2008/11/04/1343671.html

自定义EventSource(一)EventCounter

之前的Counters都是系统内置的&#xff0c;我们只需在进程外&#xff0c;或进程内采集&#xff0c;然后交给专门的展示指标工具即可。本篇说一下自定义EventSource&#xff0c;来采集自己业务中&#xff0c;或自己产品中的指标收集方式。自定义EventSource是以EventCounters作为…

看完这些自动化原理图,有一种豁然开朗的感觉

全世界只有3.14 % 的人关注了青少年数学之旅机械动态图有的可以洞察工作原理&#xff0c;有的可以洞察结构&#xff0c;有的可以表达工作过程&#xff0c;不学机械的也能看得懂&#xff01;今天的动态图总有一些你没有见过&#xff0c;相当棒&#xff01;一、机械原理篇球齿机机…

WPF开源项目:AIStudio.Wpf.AClient

介绍Wpf客户端&#xff0c;AIStudio.Wpf.AClient软件架构本框架使用Prism做MVVM&#xff0c;优点咱就不说了&#xff0c;主要了容器注入&#xff0c;消息和DI&#xff0c;比自己写省很多事。网上有很多标准的MVVM的使用方法&#xff0c;但是没有形成一个系统级的框架。本框架从…

有一说一,确实。。 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅来源微博 月刊勇者KuMa君

linux一键启动,Linux一键启动、停止、重启Tomcat sh脚本

使用方式sh service-tomcat.sh {start|stop|restart} {si|cas|fr|all}#使用过程总配置一下即可属性名字#1、COMMANDPREFIX#2、APPS#3、APPS2#4、NAMES############################ 统一启动停止前缀 begin# 统一启动停止前缀 模块名称 tomcat7_si_20080COMMANDPREFIX"to…