我正在尝试做的事情: 我试图使用.net核心2.1 mvc Web应用程序设置Azure应用配置,并在Azure应用配置中使用一个前哨键,目的是能够以天蓝色更改键,而没有一个键将在我的应用程序中更新,直到哨兵值更改。从理论上讲,这应该允许我安全地热交换配置。
我的问题是: 执行此操作时,没有可用的WatchAndReloadAll()方法来监视IWebHostBuilder上的哨兵,并且备用的Refresh()方法似乎并未刷新状态。
背景信息以及我尝试过的操作: 上周,我参加了圣地亚哥的VS Live,并观看了有关Azure App Configuration的演示。我在尝试使应用程序在隐含它时刷新配置值时遇到了一些问题,因此我也参考了此演示,介绍了如何执行此操作。相关部分的时间大约是10分钟。但是,该方法在IWebHostBuilder上似乎不可用。
我正在参考的文档: 在官方文档中没有对此方法的引用,请参阅doc quickstart .net core和doc dynamic configuration .net core
我的环境: 使用从Visual Studio Enterprise 2019运行的dot net core 2.1,以及适用于Microsoft.Azure.AppConfiguration.AspNetCore 2.0.0-preview-010060003-1250的最新预览nuget程序包
我的代码: 在演示中,他们通过CreateWebHostBuilder(string [] args)方法创建了一个IWebHostBuilder,如下所示:
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
var settings = config.Build();
config.AddAzureAppConfiguration(options =>
{
options.Connect(settings["ConnectionStrings:AzureConfiguration"])
.Use(keyFilter: "TestApp:*")
.WatchAndReloadAll(key: "TestApp:Sentinel", pollInterval: TimeSpan.FromSeconds(5));
});
})
.UseStartup<Startup>();
}
我也使用当前文档以这种方式进行了尝试:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
var settings = config.Build();
config.AddAzureAppConfiguration(options =>
{
// fetch connection string from local config. Could use KeyVault, or Secrets as well.
options.Connect(settings["ConnectionStrings:AzureConfiguration"])
// filter configs so we are only searching against configs that meet this pattern
.Use(keyFilter: "WebApp:*")
.ConfigureRefresh(refreshOptions =>
{
// In theory, when this value changes, on the next refresh operation, the config will update all modified configs since it was last refreshed.
refreshOptions.Register("WebApp:Sentinel", true);
refreshOptions.Register("WebApp:Settings:BackgroundColor", false);
refreshOptions.Register("WebApp:Settings:FontColor", false);
refreshOptions.Register("WebApp:Settings:FontSize", false);
refreshOptions.Register("WebApp:Settings:Message", false);
});
});
})
.UseStartup<Startup>();
然后,在我的启动课程中:
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<Settings>(Configuration.GetSection("WebApp:Settings"));
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseAzureAppConfiguration();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
最后是我的设置配置模型:
public class Settings
{
public string BackgroundColor { get; set; }
public long FontSize { get; set; }
public string FontColor { get; set; }
public string Message { get; set; }
}
现在,在我的控制器中,我将这些设置拖放到视图包中以在视图上显示。
public class HomeController : Controller
{
private readonly Settings _Settings;
public HomeController(IOptionsSnapshot<Settings> settings)
{
_Settings = settings.Value;
}
public IActionResult Index()
{
ViewData["BackgroundColor"] = _Settings.BackgroundColor;
ViewData["FontSize"] = _Settings.FontSize;
ViewData["FontColor"] = _Settings.FontColor;
ViewData["Message"] = _Settings.Message;
return View();
}
}
显示更改的简单视图:
<!DOCTYPE html>
<html lang="en">
<style>
body {
background-color: @ViewData["BackgroundColor"]
}
h1 {
color: @ViewData["FontColor"];
font-size: @ViewData["FontSize"];
}
</style>
<head>
<title>Index View</title>
</head>
<body>
<h1>@ViewData["Message"]</h1>
</body>
</html>
我可以得到它来第一次拉下配置,但是刷新功能似乎没有任何作用。
在上一个示例中,我希望在哨兵设置为任何新值时更新配置,或者至少在更改后30秒更新值。等待时间不长,不会更新值,只有完全关闭并重新启动应用程序才会加载新配置。
更新:添加app.UseAzureAppConfiguration(); 在启动时的configure方法中,并为config设置缓存上的显式超时,以固定refresh方法在固定的时间后刷新,但是sendinel功能仍然不起作用,refresh方法上的updateAll标志也不起作用。
ConfigureServices
在startuop.cs 中您的方法中的某处进行一些配置绑定,例如 services.Configure<LogSettings>(configuration.GetSection("LogSettings"));