Intro#

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

Configuration 重新加载实现#

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

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

Copyusing 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();        }    }}

精简版:

Copy        ///         /// 重新加载系统配置        ///         ///         public IActionResult ReloadConfiguration()        {            var configurationRoot = HttpContext.RequestServices.GetService() as IConfigurationRoot;            if (null == configurationRoot)            {                return BadRequest();            }            configurationRoot.Reload();            return Ok();        }

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

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

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

abc.json 的文件内容如下:

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

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

然后我们修改 abc.json 文件

Copy{  "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 中重新加载配置,看到这里我们就知道可以通过 IConfiguration 的 Reload 方法来重新加载应用程序的配置了,然后我们来看 WebHost.CreateDefaultBuilder(args).Build() 做了什么https://github.com/aspnet/AspNetCore/blob/master/src/DefaultBuilder/src/WebHost.cs#L149

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

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

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

上面我们已经知道 ConfigurationBuilder Build 之后返回的是一个 IConfigurationRoot 对象,而这里注入是一个 IConfiguration 对象(IConfigurationRoot 实现 IConfiguration 接口),所以我们就可以从依赖注入中获取 IConfiguration 对象直接当作 IConfigurationRoot 来使用,这也就是为什么我们会直接获取一个 IConfiguration 对象直接 as IConfigurationRoot

echart重新加载数据_在asp.net core中动态加载最新的配置信息相关推荐

  1. asp绑定gridview属性_理解ASP.NET Core中的模型验证

    当MVC执行模型绑定后,为了验证绑定为参数提供的值是否符合预期,还需要进行模型验证. 一.理解模型验证 模型验证是指模型绑定后对Action参数进行验证的过程.它会根据事先定义的规则对参数的值进行验证 ...

  2. xslt 标签取集合第一条数据_用 Asp.Net 建立一个在线 RSS 新闻聚合器

    原代码下载:RSSAggregator.msi 原文出处:Creating an Online RSS News Aggregator with ASP.NET [b]概要 本文讲解了如何使用 XML ...

  3. python requests 动态加载_Python获取网页中动态加载的数据

    Python获取网页中动态加载的数据 0.XHR 是什么? XHR是 XMLHttpRequest 对象.既Ajax功能实现所依赖的对象,在JQuery中的Ajax是对 XHR的封装. 1.查看异步加 ...

  4. Asp.net 2.0 动态加载其他子目录用户控件问题

    通常我们要在程序中动态加载用户控件: 方法很简单直接在程序里键入: (usercontrol type)a = (usercontrol type)Page.LoadControl("~/x ...

  5. asp编程工具_使用ASP.NET Core构建RESTful API的技术指南

    译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术文章<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...

  6. 在Asp.NET Core中如何优雅的管理用户机密数据

    在Asp.NET Core中如何优雅的管理用户机密数据 背景 回顾 在软件开发过程中,使用配置文件来管理某些对应用程序运行中需要使用的参数是常见的作法. 在早期VB/VB.NET时代,经常使用.ini ...

  7. 在ASP.NET Core中使用Apworks开发数据服务:对HAL的支持

    HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单.统一的形式,在API中引入超链接特性,使得API的可发现性(discoverable ...

  8. Java中动态加载字节码的方法 (持续补充)

    文章目录 Java中动态加载字节码的方法 1.利用 URLClassLoader 加载远程class文件 2.利用 ClassLoader#defineClass 直接加载字节码 2.1 类加载 - ...

  9. core控制器属性注入的用处_了解ASP.NET Core 依赖注入,看这篇就够了

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

  10. 在.Net framework中动态加载Assembly的loadFromRemoteSources配置

    简介 在插件类型的应用开发中,我们可能会在程序中动态加载一个assembly文件,创建其中的类对象并使用. 这时,就涉及到了CAS(code access security)和信任沙盒. 一般,我们的 ...

最新文章

  1. 给PS4装上Linux,然后用Xbox手柄打任天堂游戏?网友:这场面我没见过
  2. Express新建工程以及新建路由规则、匹配路由规则、控制权转移
  3. Android开发 listitem中采用倒计时
  4. 超星未来张剑谈智能网联汽车计算平台:不能只考虑算力
  5. 中国大学MOOC-数据结构基础习题集、08-1、Talent and Virtue
  6. 第三季-第7课-动态函数库设计
  7. 数据库原理及应用教程课后习题参考答案
  8. 九型人格,工作中的好帮手.
  9. 飞思卡尔单片机DZ60---时钟初始化
  10. mate 10android o主题,懒萌可爱皮卡丘全局手机主题-适配华为EMUI10.0
  11. 系统架构设计师与系统分析师历年实体分析与解答下载_架构设计的本质
  12. 安卓studio加载HTML文件,Android Studio 加载本地Assets中的html文件
  13. 51Nod-1183-编辑距离
  14. Android项目中把bin文件夹里面的.apk文件删除,怎么让它再生成
  15. RoaringBitmap数据结构以及精确去重UDAF实现
  16. 使用搜狐云景部署Ghost博客
  17. ArcGIS中地表径流
  18. 在深圳,让我们一起洞见技术的未来——2018 技术雷达峰会
  19. 基于单片机的俄罗斯方块系统设计(#0511)
  20. Counterfactual VQA: A Cause-Effect Look at Language Bias

热门文章

  1. 统计学基础之卡方检验
  2. Atitit web 之道 艾龙著 Atitit web 之道 艾龙艾提拉著v2 saa.docx 1. 第1章 Web编程基础知识 (1) 3 1.1. 1.1 什么是Web (1) 3 1.2.
  3. Atitit 知识管理 知识体系专业分类介绍
  4. Atitit 找人软福利建设 技术团队建设大概流程
  5. Atitit.软件中见算法 程序设计五大种类算法
  6. Atitit Gaussian Blur 高斯模糊 的原理and实现and 用途
  7. Atitit.反编译apk android源码以及防止反编译apk
  8. paip.远程服务器返回错误 (417) Expectation Failed 的解决办法
  9. vscode :常用快捷操作
  10. 真格基金王强:判断一个项目好坏,我会做五个思考!