Aza*_*Aza 8 c# .net-core asp.net-core asp.net-core-2.2 .net-core-2.2
在我的 .net core mvc (2.2) 应用程序中,我有一个从数据库配置的配置。如何从控制器重新加载配置,例如在更改数据库中的某些值后?我已经尝试过类似的方法,但它不起作用:
我的配置.cs:
public class MyConfiguration
{
    public string SmtpServer {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
启动.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); 
    }
}
Run Code Online (Sandbox Code Playgroud)
程序.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>();
}
Run Code Online (Sandbox Code Playgroud)
控制器:
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();
    }
}
Run Code Online (Sandbox Code Playgroud)
    小智 2
重新加载/刷新配置。
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...!");
            }
        }
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           10356 次  |  
        
|   最近记录:  |