1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
      <output id="hzk7v"></output>
    2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
    3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

      详解asp.net core重新加载应用配置

       更新时间2019年04月20日 08:51:00   作者WeihanLi   我要评论

      这篇文章主要介绍了asp.net core重新加载应用配置文中通过示例代码介绍的非常详细对大家的学习或者工作具有一定的参考学习价值需要的朋友们下面随着小编来一起学习学习吧

      asp.net core重新加载应用配置Intro

      我把配置放在了数据库或者是Redis里配置需要修改的时候我要直?#26377;?#25913;数据库然后调用一个接口去重新加载应用配置于是?#32479;?#35797;写一个运行时重新加载配置的接口

      Configuration 重新加载实现

      重新加载配置的接口其实很简单经过看 Configuration 的源码可以知道如果想要重新加载应用配置需要一个 IConfigurationRoot 对象而 IConfigurationRoot 其实可以直接拿注入服务中的 IConfiguration 对象服务中的 IConfiguration 对象也是实现了 IConfigurationRoot 接口的实例后面我们一起看源码就更清晰了

      来看实现重新加载配置的代码

      using Microsoft.AspNetCore.Mvc;
      using Microsoft.Extensions.Configuration;
      
      namespace TestWebApplication.Controllers
      {
        [Route("api/[controller]")]
        public class ConfigurationsController : Controller
        {
          private readonly IConfigurationRoot _configuration;
      
          public ConfigurationsController(IConfiguration configuration)
          {
            _configuration = configuration as IConfigurationRoot;
          }
      
          [HttpGet]
          public IActionResult Get()
          {
            return Ok(new
            {
              RootUser = _configuration.GetAppSetting("RootUser") // 这里 GetAppSetting 是一个自定义扩展方法获取AppSettings 节点下的配置信息
            });
          }
      
          [HttpPut]
          public IActionResult Put()
          {
            _configuration.Reload();
            return Ok();
          }
        }
      }

      是不是很简单下面我们来尝试一下你可以参考这个示例项目

      因为默认的项目配置会监听 appsettings.json 文件是否修改如果已修改就会重新reload这里我新加一个文件这里设置 reloadOnChangefalse示例代码如下

      public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
              .ConfigureAppConfiguration(configBuilder =>
              {
                configBuilder.AddJsonFile("abc.json", optional: true, reloadOnChange: false);
              })
              .UseStartup<Startup>();

      abc.json 的文件内容如下

      {
       "AppSettings": {
        "TestNumber": 12,
        "RootUser": "WeihanLi"
       }
      }

      dotnet run 启动网站然后在浏览器中访问 http://localhost:5000/api/configurations

      然后我们修改 abc.json 文件

      {
       "AppSettings": {
        "TestNumber": 12,
        "RootUser": "WeihanLi 123"
       }
      }

      修改保存之后刷新刚才的页面可以看?#20132;?#26159;刚才的内容证明并没有重新加载配置接下来尝试我们的重新加载配置方法

      使用 postman 或 fiddler 或其他你?#19981;?#30340;工具发一个 PUT 请求到 http://localhost:5000/api/configurations这里我使用 postman 调用 PUT 接口重新加载配置

      返回 200 即接口调用成功重新刷新刚才的页面就可以看到页面上的数据已经发生变化这也就证明了我们重新加载配置的接口生效了

      源码解析

      来看 ConfigurationBuilder 在 Build 的时候做了什么ConfigurationBuilder 源码

      可以看到这里最后返回的是一个 IConfigurationRoot 对象再来看 IConfigurationRoot 源码

      可以看到 IConfigurationRoot 定义了一个 Reload 的方法这个方法会从下面的 Providers 中重新加载配置看到这里我们就知道可以通过 IConfigurationReload 方法来重新加载应用程序的配置了然后我们来看 WebHost.CreateDefaultBuilder(args).Build() 做了什么
      https://github.com/aspnet/AspNetCore/blob/master/src/DefaultBuilder/src/WebHost.cs

      这里我们可以看到为什么 appsettings.json 文件会自动 reload 配置可以看到最后返回了一个 WebHostBuilder 对象

      看 Asp.Net core WebHostBuilder 对象的 Build 方法 https://github.com/aspnet/AspNetCore/blob/master/src/Hosting/Hosting/src/WebHostBuilder.cs

      BuildCommonServices 可以看到这样一段代码 https://github.com/aspnet/AspNetCore/blob/master/src/Hosting/Hosting/src/WebHostBuilder.cs

      上面我们已经知道 ConfigurationBuilder Build 之后返回的是一个 IConfigurationRoot 对象而这里注入是一个 IConfiguration 对象IConfigurationRoot 实现 IConfiguration 接口所以我们就可?#28304;右览?#27880;入中获取 IConfiguration 对象直接当作 IConfigurationRoot 来使用这也就是为什么我们会直接获取一个 IConfiguration 对象直接 as IConfigurationRoot

      Memo

      到此就暂时结束了希望你能有所收获~

      以上所述是小编给大家介绍的asp.net core重新加载应用配置详解整?#24076;?#24076;望对大家有所帮助如果大家有任?#25105;?#38382;请给我留言小编会及时回复大家的在此也非常?#34892;?#22823;家对脚本之家网站的支持

      相关文章

      最新评论

      3dԻв

        1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
          <output id="hzk7v"></output>
        2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
        3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

            1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
              <output id="hzk7v"></output>
            2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
            3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>