从控制器重新加载配置(asp.net 核心应用程序)
Posted
技术标签:
【中文标题】从控制器重新加载配置(asp.net 核心应用程序)【英文标题】:Reload configuration from the controller (asp.net core application) 【发布时间】:2019-11-05 15:11:33 【问题描述】:在我的 .net core mvc (2.2) 应用程序中,我有一个从数据库配置的配置。如何从控制器重新加载配置,例如在更改数据库中的某些值之后?我已经尝试过这样的事情,但它不起作用:
MyConfiguration.cs:
public class MyConfiguration
public string SmtpServer get;set;
Startup.cs:
public class Startup
public IConfiguration Configuration get;
public void ConfigureServices(IServiceCollection services)
services.Configure<MyConfiguration>(options =>
options.SmtpServer = Configuration["SmtpServer"];
);
// ...
services.AddSingleton<IConfiguration>(Configuration);
Program.cs:
public class Program
public static void Main(string[] args)
CreateWebHostBuilder(args).Build().Run();
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost
.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
config.AddEFConfiguration(options => options.UseNpgsql("connection_string"));
config.AddCommandLine(args);
)
.UseStartup<Startup>();
控制器:
public class TestController : ControllerBase
private readonly IConfigurationRoot _configurationRoot;
public TestController(IConfiguration configurationRoot)
_configurationRoot = (IConfigurationRoot)configurationRoot;
[HttpGet]
public async Task<IActionResult> Index()
// some logic for updating values in the database
// Doesn't work
_configurationRoot.Reload();
return Ok();
【问题讨论】:
阅读 IOptionsMonitor docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/… 一般来说,配置是在应用启动时设置的。某些配置提供程序支持重新加载配置的概念,结合使用IOptionsSnapshot
,您可以获得每个请求的更新值。但是,配置提供程序必须支持重新加载。数据库提供者通常不会。
通常,如果您的配置来自数据库,您通常应该创建一些存储库,您可以在需要时注入和使用。
【参考方案1】:
重新加载/刷新配置。
private IConfigurationRoot configRoot get; set;
private IOptionsSnapshot<**your config class**> IConfigurationAdapter;
public XYZController(IOptionsSnapshot<**your config class**> configurationAdapter,IConfiguration con)
if (configurationAdapter != null)
this.IConfigurationAdapter = configurationAdapter;
this.configRoot = con as IConfigurationRoot;
[HttpGet("/Reload")]
public IActionResult Reload()
if (configRoot != null)
configRoot.Reload();
return Ok("Application ConfigurationSetting Refreshed...!");
else
return Ok("Application ConfigurationSetting Not Refreshed...!");
【讨论】:
以上是关于从控制器重新加载配置(asp.net 核心应用程序)的主要内容,如果未能解决你的问题,请参考以下文章
使用服务结构和反向代理时,asp.net 核心静态文件的加载时间很慢
使用 asp.net MVC 中的参数将 javascript 中的页面重新加载到特定控制器的操作方法
用于 Asp.Net Core 的 Kestrel 网络服务器 - 是不是在一段时间后回收/重新加载