【发布时间】:2023-02-23 04:05:43
【问题描述】:
我想做什么:我正在尝试使用 .Net 6 Web API 应用程序在 Azure App Configuration 中设置 Azure App Configuration,目标是能够在 azure 中更改密钥,并且在我的应用程序中没有任何密钥会更新,直到 sentinel价值已经改变。理论上,这应该允许我安全地热插拔配置。
我的问题是:当我执行此操作时,IOptionsSnapshot 无法从 Azure 应用程序配置中获取值。我得到的值是空的,即使是第一次。 当我们使用 IConfiguration 时,我第一次可以获得这些值。
我参考的文档:我参考了 docs.microsoft 中的文档
- https://learn.microsoft.com/en-us/azure/azure-app-configuration/quickstart-aspnet-core-app?tabs=core6x
-
https://learn.microsoft.com/en-us/azure/azure-app-configuration/enable-dynamic-configuration-aspnet-core?tabs=core5x
对于动态更新,.Net 6 没有可用的参考,所以我在 .Net 5 中验证并更新了 .Net 6 的代码
我的环境:使用从 Visual Studio Enterprise 2022 运行的 dot net 6,以及 Microsoft.Azure.AppConfiguration.AspNetCore 的最新 nuget 包
我的代码: 程序.cs文件
using ReadingConfiguration.Model; var builder = WebApplication.CreateBuilder(args); #region Start reading AppSettings.Json file //Reading appsettings.json Configuration file using builder.Services.Configure<MySettingsConfiguration>( builder.Configuration.GetSection("MySettings")); builder.Services.AddConfig(builder.Configuration); #endregion // Add services to the container. #region Code start for connecting the Azure App Configuration // Using to connect the azure App configuration var connectionString = builder.Configuration.GetConnectionString("AppConfig"); builder.Host.ConfigureAppConfiguration((hostingContext, config) => { var settings = config.Build(); config.AddAzureAppConfiguration(option => { option.Connect(connectionString).ConfigureRefresh(refresh => { refresh.Register("AAConfiguration:Sentinel", refreshAll:true).SetCacheExpiration(new TimeSpan(0, 0, 30)); }); }); }) .ConfigureServices(service => { service.AddControllers(); }); //Middleware for refreshing the azure App configuration builder.Services.Configure<AAConfiguration>(builder.Configuration.GetSection("AAConfiguration")); builder.Services.AddAzureAppConfiguration(); builder.Services.AddControllers(); #endregion // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline. // If statement can be removed if we need the swagger only in development // if (app.Environment.IsDevelopment()) // { app.UseSwagger(); app.UseSwaggerUI(); // } //Middleware for refreshing the azure App configuration app.UseAzureAppConfiguration(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();读取 AzureAppConfigurationController 文件
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Options; using ReadingConfiguration.Model; namespace ReadingConfiguration { [Route("api/[controller]")] [ApiController] public class ReadingAzureAppConfigurationController : ControllerBase { private readonly AAConfiguration _aaConfiguration; private readonly IConfiguration _configuration; public ReadingAzureAppConfigurationController(IOptionsSnapshot<AAConfiguration> optionsSnapshot,IConfiguration configuration) { _aaConfiguration = optionsSnapshot.Value; _configuration = configuration; } [HttpGet] public string ReadingDynamicAzureAppConfiguration() { return _aaConfiguration.Message; } [HttpGet] [Route("ReadingAppConfig")] public string ReadingAzureAppConfiguration() { return _configuration["Message"]; } } }AA配置文件
namespace ReadingConfiguration.Model { public class AAConfiguration { public string? Message { get; set; } public int Sentinel { get; set; } } }Appsettings.Json
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "MySettings": { "Log": true, "ConnectionStringId": "Default", "Parameters": { "IsProduction": false } }, "Trading": { "ChartType": "Monthly", "Function": "Pivot", "RSI": true }, "Car": { "Manufacturer": "Fiat", "Model": "Punto", "Year": 2013 }, "AllowedHosts": "*" }MyConfigServiceCollectionExtensions 文件
using Microsoft.Extensions.Configuration; using ReadingConfiguration.Model; namespace Microsoft.Extensions.DependencyInjection { public static class MyConfigServiceCollectionExtensions { public static IServiceCollection AddConfig(this IServiceCollection services, IConfiguration configuration) { #region This will read the configuration from appsettings.json services.Configure<TradingConfiguration>( configuration.GetSection("Trading") ); services.Configure<CarConfiguration>( configuration.GetSection("Car") ); #endregion // This will read the configuration azure app configuration services.Configure<AAConfiguration>( configuration.GetSection("AAConfiguration") ); return services; } } }使用用户机密从本地计算机连接到应用程序配置。
-
创建秘密管理器密钥以在开发时连接到本地计算机中的 Azure 应用程序配置 dotnet 用户机密初始化
-
在 Secret Manager 中配置 Azure App 配置的连接字符串。
dotnet user-secrets set ConnectionStrings:AppConfig“使用您的应用配置主连接字符串”
- 从 Nuget Microsoft.Azure.AppConfiguration.AspNetCore 添加包
-
【问题讨论】:
标签: c# asp.net-core .net-core .net-6.0 azure-app-configuration