1. 概述
随着. NET Core技术的日益普及,越来越多的开发人员和团队选择借助.Net Core的优势开发跨平台应用。.NET Core 不仅跨平台,而且具有更高的性能和更好的移植性。 在应用程序开发的过程中,配置信息是非常重要的,一般需要将配置信息存储在配置文件中,这样可以方便地更改配置信息,而不需要修改代码。本文将介绍在 .NET Core 应用程序中如何使用配置文件和自动更新来实现方便的配置信息管理和自动更新。
2. 配置文件使用方法
配置是大多数应用程序所必需的,因为它允许您将应用程序行为的细节分离出来,这样您就可以轻松地更新应用程序的行为,而无需重新编译它。 在.NET Core应用程序中,我们可以使用 appsettings.json 文件来存储应用程序的配置信息。这个json文件通常位于项目的根目录下,示例代码如下:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
在以上示例中,我们定义了Logging和AllowedHosts两个配置项,并设置它们的默认值。您可以根据自己应用程序的需求来定义和设置配置项。 在代码中,我们可以使用 IConfiguration 接口来获取配置信息。在 asp.net core 中,这个接口默认注入到服务容器中,示例代码如下:
public class HomeController : Controller
{
private readonly IConfiguration _configuration; //注入 IConfiguration
public HomeController(IConfiguration configuration)
{
_configuration = configuration;
}
public IActionResult Index()
{
var logLevel = _configuration["Logging:LogLevel:Default"]; //获取配置信息
return View();
}
}
在以上示例中,我们首先在 HomeController 中注入 IConfiguration,然后在 Index() 方法中使用 _configuration.GetData("Logging:LogLevel:Default")方法来获取配置信息。
3. 配置文件重载和监控
在应用程序运行时,配置信息是可以通过配置文件的重载来进行动态更改的。 更改配置文件后,应用程序会自动检测到更改并重新加载文件中的配置。 但是,为了使应用程序在文件更改时能够自动重载配置信息,我们需要添加 Watch() 方法来监控配置文件的变化。 示例代码如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
context.Response.ContentType = "text/html";
await context.Response.WriteAsync("Hello, World!
");
});
});
var builder = new ConfigurationBuilder() //重载配置文件
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
var configuration = builder.Build();
var host = configuration.GetValue("AppSettings:Host");
app.Run(async context =>
{
context.Response.ContentType = "text/html";
await context.Response.WriteAsync($"
Hello, World!
Host: {host}");
});
}
在以上示例中, 我们使用了 reloadOnChange: true
来在配置文件变化时启用自动重载。
我们还可以通过使用 IOptionsSnapshot 来监听和响应配置文件的变化。 IOptionsSnapshot 会在配置文件更改时自动更新其值,使我们不用手动在代码中重载配置信息。 示例代码如下:
public class HomeController : Controller
{
private readonly IOptionsSnapshot _appSettings;
public HomeController(IOptionsSnapshot appSettings)
{
_appSettings = appSettings;
}
public IActionResult IndexView()
{
var appSetting = _appSettings.Value;
return View(appSetting);
}
}
在以上示例中,我们注入了 IOptionsSnapshot
4. 自动更新配置信息
在实际应用程序中,如果配置信息需要在应用程序运行时更改,使用配置文件对于一些敏感信息并不方便。因此,我们需要提供一种途径来实现配置信息的自动更新。 使用 Microsoft.Extensions.Configuration.Etcd包,我们可以从Etcd 中读取配置信息,实现自动更新的效果。 在 Etcd 中存储的配置信息与在appsettings.json中存储的格式相同,您可以从Etcd 和 appsettings.json 中读取配置信息。 示例代码如下:
public void ConfigureServices(IServiceCollection services)
{
var etcdOptions = Configuration.GetSection("Etcd").Get();
var etcdClient = new EtcdClient(etcdOptions.ServerUrl);
services.AddSingleton(etcdClient); //注册EtcdClient
var builder = new ConfigurationBuilder()
.AddEtcdConfiguration(options =>
{
options.Client = etcdClient;
options.Key = etcdOptions.Key;
});
services.AddSingleton(builder.Build());
}
在以上示例中,我们使用 AddEtcdConfiguration() 方法向服务容器中添加 Etcd 配置信息。我们也将 EtcdClient 注册到服务容器中,以便我们可以在代码中使用它来读取配置信息。
4.1 配置信息自动更新
为了实现自动更新,我们需要首先监听配置信息变化的事件。当发生变化时,我们将重新读取配置信息并更新应用程序中的配置值。 示例代码如下:
public void ConfigureServices(IServiceCollection services)
{
//注册EtcdClient
services.AddSingleton(etcdClient);
var builder = new ConfigurationBuilder()
.AddEtcdConfiguration(options =>
{
options.Client = etcdClient;
options.Key = etcdOptions.Key;
options.ReloadOnChange = true; //开启自动更新
});
//注册配置信息更新监听器
builder.RegisterConfigurationWatcher(services.BuildServiceProvider());
services.AddSingleton(builder.Build());
}
public static class ConfigurationWatcherExtensions
{
public static void RegisterConfigurationWatcher(this IConfigurationBuilder builder, IServiceProvider serviceProvider)
{
var etcdClient = serviceProvider.GetService();
if (etcdClient == null) throw new ArgumentException("Etcd client is not registered.");
var sources = builder.Sources.OfType();
foreach (var source in sources)
{
etcdClient.Watch(source.Key, (etcdResponse) =>
{
Console.WriteLine("Configuration changed. Reloading...");
source.Reload();
});
}
}
}
在以上示例中,我们注册了 a Watcher, 监听配置信息的变化事件,并在事件触发时重新读取配置信息并更新应用程序中的配置值。在这里,我们使用了 etcdClient.Watch() 方法来监听配置信息的变化。每当变化发生时,我们都会重载 ConfigurationBuilder,然后重新注册 IConfigurationBuilder。
4.2 配置信息加密
在一个应用程序中,敏感信息很可能被攻击者窃取。因此,在读取配置信息时,必须确保安全性。在.NET Core中,可以使用 Microsoft.Azure.KeyVault包对敏感信息进行加密。示例代码如下:
public class SecretConfigurations
{
public string ApiKey { get; set; }
public string ApiSecret { get; set; }
}
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
var kvc = new KeyVaultClient(async (authority, resource, scope) =>
{
var authContext = new AuthenticationContext(authority);
var credentials = new ClientCredential(Configuration["AzureAd:ClientId"], Configuration["AzureAd:ClientSecret"]);
var result = await authContext.AcquireTokenAsync(resource, credentials);
if (result == null)
throw new InvalidOperationException("Failed to obtain the JWT token");
return result.AccessToken;
});
services.AddSingleton(kvc);
var secrets = new SecretConfigurations();
Configuration.GetSection("Secrets").Bind(secrets);
secrets.ApiKey = await kvc.GetSecretAsync("https://your-vault.vault.azure.net/", "Api-Key").ConfigureAwait(false);
secrets.ApiSecret = await kvc.GetSecretAsync("https://your-vault.vault.azure.net/", "Api-Secret").ConfigureAwait(false);
services.AddSingleton(secrets);
}
}
在以上示例中,我们定义了一个名为 SecretConfigurations 的类来存储从 Key Vault 获取的敏感信息。我们还定义了一个名为 IKeyVaultClient 的接口,用于从 Azure key Vault 中获取机密。在 ConfigureServices() 方法中,在绑定 appsettings.json 中的 Secrets 部分之后,我们创建了一个名为 kvc 的 KeyVaultClient 对象,然后调用 kvc.GetSecretAsync 方法来解密 Secrets 中的每个值。???? ??? ??? SecretConfigurations ??? ??? ?? ???? DI ?????? ?????.
总结
在本文中,我们介绍了如何在 .NET Core 应用程序中使用配置文件和自动更新功能来管理配置信息,以及如何保护敏感信息。配置信息在应用程序中非常重要,可以让开发人员轻松更新应用程序的行为,在 Etcd 中存储的信息可以保证配置信息的自动重载。对于应用程序中的敏感信息,我们可以使用 Azure Key Vault来进行加密,从而保证安全性。