随笔 - 81  文章 - 0  评论 - 514  阅读 - 41万

.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();
        }
}
复制代码

 

posted on   包子wxl  阅读(4191)  评论(16编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏