最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Asp.net core中实现自动更新的Option的方法示例

来源:懂视网 责编:小采 时间:2020-11-27 22:34:39
文档

Asp.net core中实现自动更新的Option的方法示例

Asp.net core中实现自动更新的Option的方法示例:Asp.net core可以监视json、xml等配置文件的变化, 自动刷新内存中的配置内容, 但如果想每隔1秒从zookeeper、consul获取最新的配置信息, 需要自己实现. 阅读了 Asp.net core Document的Custom configuration provider, 得知只需
推荐度:
导读Asp.net core中实现自动更新的Option的方法示例:Asp.net core可以监视json、xml等配置文件的变化, 自动刷新内存中的配置内容, 但如果想每隔1秒从zookeeper、consul获取最新的配置信息, 需要自己实现. 阅读了 Asp.net core Document的Custom configuration provider, 得知只需

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 = 0;
 private bool isChanged;

 public AutoRefreshConfigurationProvider() : base()
 {
 Timer timer = new Timer(TimerCallback);
 timer.Change(1000, 3000);
 }

 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 > 0)
 {
 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可以看到返回内容的变化

本文代码

文档

Asp.net core中实现自动更新的Option的方法示例

Asp.net core中实现自动更新的Option的方法示例:Asp.net core可以监视json、xml等配置文件的变化, 自动刷新内存中的配置内容, 但如果想每隔1秒从zookeeper、consul获取最新的配置信息, 需要自己实现. 阅读了 Asp.net core Document的Custom configuration provider, 得知只需
推荐度:
标签: 自动刷新 as core
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top