.NET5修改配置不重啟自動生效


.NET Core,.NET5默認配置都是只加載一次,修改配置時都需要重啟才能生效,如何能修改即時生效呢,下面來演示一遍。

一、設置配置文件實時生效

1.1配置

在Program.cs的CreateHostBuilder()處增加加載配置文件的時候,reloadOnChange:true。

這樣配置文件修改的時候,程序就會監聽到文件發生變化,自動重新加載了。

 public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
           .ConfigureAppConfiguration((context, config) =>
            {
                config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();

                });

1.2驗證

appsettings.json文件內容如下

{
  "TestSetting": "123",
  "AppOptions": {
    "UserName": "zhangsan"
  }
}

代碼:

 public class HomeController : Controller
    {
     private readonly ILogger<HomeController> _logger;
        private readonly IConfiguration _configuration;
        public HomeController(ILogger<HomeController> logger, IConfiguration configuration)
        {
            _logger = logger;
            _configuration = configuration;
        }

        public IActionResult Index()
        {
            string Name = _configuration["TestSetting"];
            string Name2 = _configuration["AppOptions:UserName"];
            ViewBag.Name = Name;
            ViewBag.Name2 = Name2;
            return View();
        }
}

 

界面顯示:

 

 

 把配置文件修改為:

{
  "TestSetting": "abc",
  "AppOptions": {
    "UserName": "zhangsan123"
  }
}

刷新頁面,已經發生變化:

 

 

 

1.3 IOptions方式實時生效

新建AppOptions.cs類

/// <summary>
    /// 配置文件
    /// </summary>
    public class AppOptions
    {
        public string UserName { get; set; }
    }

在Startup.cs處把配置加到Options

  public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.Configure<AppOptions>(Configuration.GetSection("AppOptions"));
        }

使用:

 public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IConfiguration _configuration;
        private IOptionsMonitor<AppOptions> _options;
        public HomeController(ILogger<HomeController> logger, IConfiguration configuration, IOptionsMonitor<AppOptions> appOptions)
        {
            _logger = logger;
            _configuration = configuration;
            _options = appOptions;
        }

        public IActionResult Index()
        {
            string Name = _configuration["TestSetting"];
            string Name2 = _options.CurrentValue.UserName;
            ViewBag.Name = Name;
            ViewBag.Name2 = Name2;
            return View();
        }
}

 

IOptions有三種方式

//IOptions<T> //站點啟動后,獲取到的值永遠不變
//IOptionsMonitor<T> //站點啟動后,如果配置文件有變化會發布事件 (加載配置時,reloadOnChange:true 必須為true)
//IOptionsSnapshot<T> //站點啟動后,每次獲取到的值都是配置文件里的最新值 (加載配置時,reloadOnChange:true 必須為true)

注意: 

IOptionsMonitor<T> 和 IOptionsSnapshot<T> 的最大區別是前者可以被其他的Singleton Services使用而后者不可以, 因為前者被注冊為Singleton 而后者是被注冊為Scoped,也就是說文件被修改了前者會立即Reload,而后者是在每個請求才被Reload。

例:

 public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private UserService _userService;
        public HomeController(ILogger<HomeController> logger, UserService userService)
        {
           
            _userService = userService;
        }

        public IActionResult Index()
        {
            string Name2 = _userService.GetName();
            ViewBag.Name2 = Name2;
            return View();
        }
}

 

 public class UserService
    {
        private IOptionsMonitor<AppOptions> _options;
        public UserService(IOptionsMonitor<AppOptions> appOptions)
        {
            _options = appOptions;
        }
        public string GetName()
        {
            var Name = _options.CurrentValue.UserName;
            return Name;
        }
    }

 

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.Configure<AppOptions>(Configuration.GetSection("AppOptions"));
            services.AddSingleton<UserService>();
        }

上面的UserService是單例注入的,通過IOptionsMonitor<T>的方式是可以實現配置實時刷新的,而IOptionsSnapshot<T>啟動就會報錯。

1.4多個配置文件加載實時生效

增加多一個db配置文件

 

 

修改Program.cs處CreateHostBuilder(),也是加載時加上reloadOnChange:true 就可以了。

  public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
            {
                config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
                config.AddJsonFile("Configs/dbsetting.json", optional: true, reloadOnChange: true);
            })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();

                });

 

使用也是一樣的:

 public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IConfiguration _configuration;
        private AppOptions _options;
        public HomeController(ILogger<HomeController> logger, IConfiguration configuration, IOptionsMonitor<AppOptions> appOptions)
        {
            _logger = logger;
            _configuration = configuration;
            _options = appOptions.CurrentValue;
        }

        public IActionResult Index()
        {
            string Name = _configuration["TestSetting"];
            string Name2 = _configuration["db:connection1"];
            ViewBag.Name = Name;
            ViewBag.Name2 = Name2;
            return View();
        }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM