中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Asp.net core中實現自動更新Option

發布時間:2021-05-24 16:48:29 來源:億速云 閱讀:132 作者:Leah 欄目:開發技術

如何在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 = 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() };
  }
}

ASP.NET 是什么

ASP.NET 是開源,跨平臺,高性能,輕量級的 Web 應用構建框架,常用于通過 HTML、CSS、JavaScript 以及服務器腳本來構建網頁和網站。

看完上述內容,你們掌握如何在Asp.net core中實現自動更新Option的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江西省| 新营市| 宁南县| 资溪县| 平舆县| 商洛市| 桓仁| 大邑县| 扎囊县| 光山县| 庆元县| 汉寿县| 阜城县| 萨迦县| 宜春市| 田林县| 三河市| 资中县| 孙吴县| 晋江市| 汝城县| 纳雍县| 阳曲县| 赣州市| 鹰潭市| 东丰县| 龙南县| 新绛县| 内乡县| 龙门县| 康定县| 金川县| 荆州市| 诸城市| 盐源县| 田阳县| 孝昌县| 喀喇沁旗| 金塔县| 米易县| 宁阳县|