Asp.net core中实现自动更新的Option
Asp.net core可以监视json、xml等配置文件的变化, 自动刷新内存中的配置内容, 但如果想每隔1秒从zookeeper、consul获取最新的配置信息, 需要自己实现.
阅读了 Asp.net core Document的Custom configuration provider, 得知只需要实现自己的IConfigurationSource和对应ConfigurationProvider即可
在这个示例中, 我建立了一个简单的option, 只包含一个不断变化的计数器变量.
public class RefreshableOptions
{
public int IncreasementCount { get; set; }
}
实现IConfigurationSource和对应ConfigurationProvider, 内部有一个timer模拟从外部获取了最新的数据, 这里为简单起见, 采用硬编码的方式指定了option的路径
public class AutoRefreshConfigurationSource : IConfigurationSource
{
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new AutoRefreshConfigurationProvider();
}
} public class AutoRefreshConfigurationProvider : ConfigurationProvider
{
private int count = ;
private bool isChanged; public AutoRefreshConfigurationProvider() : base()
{
Timer timer = new Timer(TimerCallback);
timer.Change(, );
} public override void Load()
{
var beforeData = Data;
// 这里采用硬编码指定option的路径
Data = new Dictionary<string, string>() { { "AutoRefreshOptions:IncreasementCount", count.ToString() } };
isChanged = IsDictionaryChanged(beforeData, Data);
} private void TimerCallback(object state)
{
count++;
this.Load();
if (isChanged)
{
base.OnReload();//通知IConfiguration实例, 有参数发生了改变
isChanged = false;
}
}
//判断两个Idictionary是否有不同的帮助方法
private static bool IsDictionaryChanged(IDictionary<string, string> before, IDictionary<string, string> after)
{
if (before == null && after == null)
{
return false;
}
if ((before == null) != (after == null))
{
return true;
}
if (before.Count != after.Count)
{
return true;
}
var ignoreCaseBefore = new Dictionary<string, string>(before, StringComparer.OrdinalIgnoreCase);
foreach (var afterItemKey in after.Keys)
{
if (!ignoreCaseBefore.TryGetValue(afterItemKey, out var beforeItemValue))
{
return true;
}
if (beforeItemValue != after[afterItemKey])
{
return true;
}
ignoreCaseBefore.Remove(afterItemKey);
}
if (ignoreCaseBefore.Count > )
{
return true;
}
return false;
}
}
实现扩展方法
public static class AutoRereshConfigurationExtensions
{
public static IConfigurationBuilder AddAutoRereshConfiguration(this IConfigurationBuilder builder)
{
return builder.Add(new AutoRefreshConfigurationSource());
}
}
使用方法
新建一个WebApi项目, 在Program.CreateWebHostBuilder中增加黄色部分
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(config =>
{
config.AddAutoRereshConfiguration();
})
.UseStartup<Startup>();
在Startup. ConfigureServices中配置
services.Configure<RefreshableOptions>(Configuration.GetSection("AutoRefreshOptions"));
修改ValuesController
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private RefreshableOptions refreshableOptions;
public ValuesController(IOptionsSnapshot<RefreshableOptions> refreshableOptions)
{
this.refreshableOptions = refreshableOptions.Value;
}
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { "value1", "value2", refreshableOptions.IncreasementCount.ToString() };
}
}
启动后不停的刷新http://localhost:5000/api/values可以看到返回内容的变化
后记: 这个功能写得比较早, 后来在nuget上发现很多consul configure的扩展, 这段代码就全当练习吧.
Asp.net core中实现自动更新的Option的更多相关文章
- 在ASP.NET Core中实现自动注入、批量注入
我们在使用AddScoped.AddTransient.AddSingleton这类方法的时候很是麻烦.我们每增加一个接口以及其实现的时候,是不是需要在这里硬编码注册一行代码呢?项目小还好,但当我们的 ...
- 在ASP.NET Core中添加的Cookie如果含有特殊字符,会被自动转义
我们知道在Cookie中有些字符是特殊字符,这些字符是不能出现在Cookie的键值中的. 比如"="是Cookie中用来分隔键和值的特殊字符,例如:Key01=Value01,表示 ...
- ASP.NET Core 中文文档 第二章 指南(4.6)Controller 方法与视图
原文:Controller methods and views 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘) .张仁建(第二年.夏) .许登洋(Seay) .姚阿勇 ...
- 如何在ASP.NET Core中实现CORS跨域
注:下载本文的完整代码示例请访问 > How to enable CORS(Cross-origin resource sharing) in ASP.NET Core 如何在ASP.NET C ...
- ASP.NET Core 中文文档
ASP.NET Core 中文文档 翻译计划 五月中旬 .NET Core RC2 如期发布,我们遂决定翻译 ASP.NET Core 文档.我们在 何镇汐先生. 悲梦先生. 张仁建先生和 雷欧纳德先 ...
- 在ASP.NET Core 中使用Cookie中间件
在ASP.NET Core 中使用Cookie中间件 ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分 ...
- 在 ASP.NET Core 中执行租户服务
在 ASP.NET Core 中执行租户服务 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://gunna ...
- ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)
不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...
- ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)
前言 本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截 觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐 这里就不详细的赘述IOC是什么 以及DI是什么了 ...
随机推荐
- Error occurred during initialization of VM Could not reserve enough space for object heap
Error occurred during initialization of VM Could not reserve enough space for object heap Java虚拟机(JV ...
- Linux中VIM的使用
转自:http://www.lupaworld.com/?uid-296380-action-viewspace-itemid-118973 vi/vim 基本使用方法本文介绍了vi (vim)的基本 ...
- sublimit 编辑器 设置默认的编码
1.首选项>>设置 - 用户 2.加上:"default_encoding": "UTF-8"
- java-网络通信-索引
HTTP协议 关于HTTP协议,一篇就够了 HTTP与HTTPS的区别 HTTP Keep-Alive模式 HTTP长连接和短连接 HTTP的长连接(持久连接)和短连接 HTTP的长连接 ...
- [UnityShader基础]08.UI-Default.shader
参考链接: https://zhuanlan.zhihu.com/p/32561155 https://blog.csdn.net/WuShangLZ/article/details/80401441 ...
- Jprofiler监控远程jvm
2.Windows打开安装好的jprofiler 1 3.配置步骤: vi catalina.sh 添加复制的配置保存退出后重新停启Tomcatsh shutdown.sh #停ps -ef|grep ...
- (11)ssh免密登录配置
***在Linux命令行中登录到另一台虚拟机(需要用到ssh协议) Linux中默认有ssh的服务器端和客户端,客户端的名字就叫ssh 前提是当前使用的用户名在待连接的虚拟机中存在 格式: ssh ...
- js基本知识
1.js中的数据类型: js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型. 2.typeof 返回的是字符串,有 ...
- django 加载css、js和图片记载不上
在django的setting里加以下配置 STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), 'Djago/static/',)
- CI、CD相关概念
1.CI:持续集成(CONTINUOUS INTEGRATION) 基本概念 CI的全称是Continuous Integration,表示持续集成. 在CI环境中,开发人员将会频繁地向主干提交代码. ...