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

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

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

我把配置放在了数据库或者是Redis里,配置需要修改的时候我要直接修改数据库,然后调用一个接口去重新加载应用配置,于是就尝试写一个运行时重新加载配置的接口。

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"
 }
}

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

使用 postman 或 fiddler 或其他你喜欢的工具发一个 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 接口),所以我们就可以从依赖注入中获取 IConfiguration 对象直接当作 IConfigurationRoot 来使用,这也就是为什么我们会直接获取一个 IConfiguration 对象直接 as IConfigurationRoot

Memo

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

以上所述是小编给大家介绍的asp.net core重新加载应用配置详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • .net下实现Word动态填加数据打印

    .net下实现Word动态填加数据打印

    .net下实现Word动态填加数据打印...
    2007-04-04
  • .net中自定义错误页面的实现升级篇

    .net中自定义错误页面的实现升级篇

    这篇文章主要给大家介绍了关于.net中自定义错误页面实现的相关资料,这篇文章是之前的升级篇,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • ASP.NET MVC使用Log4Net记录异常日志并跳转到静态页

    ASP.NET MVC使用Log4Net记录异常日志并跳转到静态页

    这篇文章介绍了ASP.NET MVC使用Log4Net记录异常日志并跳转到静态页的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • asp.net 数据绑定的实例代码

    asp.net 数据绑定的实例代码

    这篇文章介绍了asp.net 数据绑定的实例代码,有需要的朋友可以参考一下
    2013-07-07
  • .net通过Action进行Options参数的传递的方法

    .net通过Action进行Options参数的传递的方法

    在.NET Core中,使用Action和Options参数方式配置服务并将配置信息对象注册到IServiceCollection的好处在于,它提供了更高级别的可配置性和可扩展性,这篇文章主要介绍了.net通过Action进行Options参数的传递,你知道是怎么实现的吗,需要的朋友可以参考下
    2023-12-12
  • Asp.net后台调用js 2种方法

    Asp.net后台调用js 2种方法

    这篇文章主要介绍了Asp.net后台调用js的二种方法,大家参考使用吧
    2013-11-11
  • ASP.NET使用正则表达式屏蔽垃圾信息

    ASP.NET使用正则表达式屏蔽垃圾信息

    找资料,看看如何实现使用正则表达式屏蔽垃圾信息,找来找去找出来的都不怎么好,有不详细的,有代码缺失的。最后还是找到了微软,先摘过来,大概思路已经有了,只需把下面微软给的样例代码修改一下即可,具体能不能行还不知道,先睡一觉,起来再慢慢研究。
    2008-09-09
  • ASP.NET Core中间件初始化的实现

    ASP.NET Core中间件初始化的实现

    在日常使用ASP.NET Core开发的过程中我们多多少少会设计到使用中间件的场景,本文探究了ASP.NET Core中间件是如何初始化的,感兴趣的可以了解一下
    2021-05-05
  • JavaScript验证用户输入的是字符或数字及ASCII Chart应用

    JavaScript验证用户输入的是字符或数字及ASCII Chart应用

    我们可以根据onkeydown事件的event.keyCode即是ASCII Chart来判断字符或数字等,本文提供了相关键盘key对应的ASCII码,以供用户使用是参考及使用onpaste事件只能输入字符和数字防止粘贴等的,感兴趣的朋友可以了解下
    2013-01-01
  • asp.net 利用IIS的404错误将文件重写成目录的简单方法

    asp.net 利用IIS的404错误将文件重写成目录的简单方法

    为什么要把文件重写成目录,主要原因是讨好搜索引擎,至于为什么写成目录搜索引擎就比较容易搜录不在本文讨论范围之内。
    2009-09-09

最新评论