景区网站建设策划,网站icp备案号怎么查询,企业宣传片,河源市网站建设使用 Minimal API 改造动态文件提供者Intro之前介绍过一个基于动态文件提供者来实现静态网站的动态更新#xff0c;可以参考 ASP.NET Core 实现一个简单的静态网站滚动更新#xff0c;在 Minimal API 出现之后想改造成 Minimal API 的写法#xff0c;但是由于之前版本的 Min… 使用 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 的时候并不会触发配置变化详细可以参考这个 issuehttps://github.com/dotnet/aspnetcore/issues/34056为了方便重现我也写了一个简单的示例来重现这个问题需要 .NET 6 Preview 4/5有需要的童鞋可以参考https://github.com/WeihanLi/AspNetCorePlayground/tree/master/MinimalAPIConfigurationIssueMinimal API之前的代码也使用了 C# 9 的新特性去掉了 Main 已经比较简洁了var builder Host.CreateDefaultBuilder(args);
builder.ConfigureWebHostDefaults(webHostBuilder
{webHostBuilder.ConfigureServices((context, services) {services.ConfigureDynamicFileProviderOptions(context.Configuration);services.AddSingletonDynamicFileProvider();});webHostBuilder.Configure(app {app.Map(new PathString(/redeploy), appBuilder appBuilder.Run(context {if (context.RequestServices.GetRequiredServiceIConfiguration() 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.GetRequiredServiceDynamicFileProvider();app.UseStaticFiles(new StaticFileOptions(){FileProvider dynamicFileProvider,});});
});
var host builder.Build();
host.Run();
使用 Minimal API 之后代码更加简洁代码量减少到原来代码量的一半左右改造后的代码如下var builder WebApplication.CreateBuilder(args);
builder.Services.ConfigureDynamicFileProviderOptions(builder.Configuration);
builder.Services.AddSingletonDynamicFileProvider();
var app builder.Build();
app.Map(new PathString(/redeploy), appBuilder appBuilder.Run(context
{if (context.RequestServices.GetRequiredServiceIConfiguration() 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.GetRequiredServiceDynamicFileProvider();
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 即将到来的新特性 — 隐式命名空间引用 我们将可以移除命名空间引用进一步精简我们的代码Referenceshttps://github.com/WeihanLi/SamplesInPractice/tree/master/DynamicStaticFileProviderhttps://github.com/dotnet/aspnetcore/issues/34056https://github.com/dotnet/aspnetcore/pull/33081https://github.com/WeihanLi/AspNetCorePlayground/tree/master/MinimalAPIConfigurationIssuehttps://github.com/dotnet/aspnetcore/compare/v6.0.0-preview.5.21301.17...v6.0.0-preview.6.21355.2#diff-64b273cd414609b9e4c6b0f7d1135735073283603825b1d2c19480357b0206c5R89