欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何在.NetCore中自定義配置源-創(chuàng)新互聯(lián)

這篇文章給大家介紹如何在.Net Core中自定義配置源,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

為牡丹等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及牡丹網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、牡丹網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

模擬配置中心


我們新建一個(gè)asp.net core webapi站點(diǎn)來(lái)模擬配置中心服務(wù),端口配置到5000,并添加相應(yīng)的controller來(lái)模擬配置中心對(duì)外的接口。

  [Route("api/[controller]")]
 [ApiController]
 public class ConfigsController : ControllerBase
 {
  public List<KeyValuePair<string,string>> Get()
  {
   var configs = new List<KeyValuePair<string, string>>();
   configs.Add(new KeyValuePair<string, string>("SecretKey","1238918290381923"));
   configs.Add(new KeyValuePair<string, string>("ConnectionString", "user=123;password=123;server=."));

   return configs;
  }
 }

添加一個(gè)configscontroller,并修改Get方法,返回2個(gè)配置鍵值對(duì)。

如何在.Net Core中自定義配置源

訪問(wèn)下/api/configs看下返回是否正確

自定義配置源


從現(xiàn)在開(kāi)始我們真正開(kāi)始來(lái)定義一個(gè)自定義的配置源然后當(dāng)程序啟動(dòng)的時(shí)候從配置中心讀取配置文件信息,并提供給后面的代碼使用配置。


新建一個(gè)asp.net core mvc站點(diǎn)來(lái)模擬客戶端程序。

MyConfigProvider


 public class MyConfigProvider : ConfigurationProvider
 {
  /// <summary>
  /// 嘗試從遠(yuǎn)程配置中心讀取配置信息
  /// </summary>
  public async override void Load()
  {
   var response = "";
   try
   {
    var serverAddress = "http://localhost:5000";
    var client = new HttpClient();
    client.BaseAddress = new Uri(serverAddress);
    response = await client.GetStringAsync("/api/configs");
   }
   catch (Exception ex)
   {
    //write err log
   }

   if (string.IsNullOrEmpty(response))
   {
    throw new Exception("Can not request configs from remote config center .");
   }

   var configs = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(response);

   Data = new ConcurrentDictionary<string, string>();

   configs.ForEach(c =>
   {
    Data.Add(c);
   });
  }
 
 }

新建一個(gè)MyConfigProvider的類,這個(gè)類從ConfigurationProvider繼承,并重寫(xiě)其中的Load方法。使用HttpClient從配置中心讀取信息后,進(jìn)行反序列化,并把配置轉(zhuǎn)換為字典。這里注意一下,雖然Data的類型為IDictionary<string,string>,但是這里實(shí)例化對(duì)象的時(shí)候使用了ConcurrentDictionary<string, string>類,因?yàn)镈ictionary<string,string>是非線程安全的,如果進(jìn)行多線程讀寫(xiě)會(huì)出問(wèn)題。

MyConfigSource


 public class MyConfigSource : IConfigurationSource
 {
  public IConfigurationProvider Build(IConfigurationBuilder builder)
  {
   return new MyConfigProvider();
  }
 }

新建一個(gè)MyConfigSource的類,這個(gè)類實(shí)現(xiàn)IConfigurationSource接口,IConfigurationSource接口只有一個(gè)Build方法,返回值為IConfigurationProvider,我們剛才定義的MyConfigProvider因?yàn)槔^承自ConfigurationProvider所以已經(jīng)實(shí)現(xiàn)了IConfigurationProvider,我們直接new一個(gè)MyConfigProvider并返回。

MyConfigBuilderExt


 public static class MyConfigBuilderExt
 {
  public static IConfigurationBuilder AddMyConfig(
   this IConfigurationBuilder builder
   )
  {
   return builder.Add(new MyConfigSource());
  }
 }

給IConfigurationBuilder定義一個(gè)AddMyConfig的擴(kuò)展方法,跟.Net Core自帶的幾個(gè)配置源使用風(fēng)格保持一致。當(dāng)調(diào)用AddMyConfig的時(shí)候給IConfigurationBuilder實(shí)例添加一個(gè)MyConfigSource的源。

使用配置源


在Program中添加MyConfigSource


  public class Program
 {
  public static void Main(string[] args)
  {
   CreateWebHostBuilder(args).Build().Run();
  }

  public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
   WebHost.CreateDefaultBuilder(args)
   .ConfigureAppConfiguration((context, configBuiler) =>
   {
    configBuiler.AddMyConfig();
   })
   .UseStartup<Startup>();
 }

在ConfigureAppConfiguration的匿名委托方法中調(diào)用AddMyConfig擴(kuò)展方法,這樣程序啟動(dòng)的時(shí)候會(huì)自動(dòng)使用MyConfigSource源并從配置中心讀取配置到本地應(yīng)用程序。

修改HomeController


 public class HomeController : Controller
 {
  IConfiguration _configuration;
  public HomeController(IConfiguration configuration)
  {
   _configuration = configuration;
  }

  public IActionResult Index()
  {
   var secretKey = _configuration["SecretKey"];
   var connectionString = _configuration["ConnectionString"];

   ViewBag.SecretKey = secretKey;
   ViewBag.ConnectionString = connectionString;

   return View();
  }
  
 }

修改homecontroller,把IConfiguration通過(guò)構(gòu)造函數(shù)注入進(jìn)去,在Index Action方法中讀取配置,并賦值給ViewBag

修改Index視圖


 @{
 ViewData["Title"] = "Test my config";
}

<h4>
 SecretKey: @ViewBag.SecretKey
</h4>
<h4>
 ConnectionString: @ViewBag.ConnectionString
</h4>

修改Index視圖的代碼,把配置信息從ViewBag中讀取出來(lái)并在網(wǎng)頁(yè)上展示。

運(yùn)行一下

如何在.Net Core中自定義配置源

先運(yùn)行配置中心站點(diǎn)再運(yùn)行一下網(wǎng)站,首頁(yè)出現(xiàn)了我們?cè)谂渲弥行亩x的SecretKey跟ConnectionString信息,表示我們的程序成功的從配置中心讀取了配置信息。我們的自定義配置源已經(jīng)能夠成功運(yùn)行了。

改進(jìn)


以上配置源雖然能夠成功運(yùn)行,但是仔細(xì)看的話顯然它有2個(gè)比較大的問(wèn)題。

  • 配置中心的服務(wù)地址是寫(xiě)死在類里的。我們的配置中心很有可能會(huì)修改ip或者域名,寫(xiě)死在代碼里顯然不是高明之舉,所以我們還是需要保留本地配置文件,把配置中心的服務(wù)地址寫(xiě)到本地配置文件中。

  • 配置中心作為微服務(wù)的基礎(chǔ)設(shè)施一旦故障會(huì)引發(fā)非常嚴(yán)重的后果,新啟動(dòng)或者重啟的客戶端會(huì)無(wú)法正常啟動(dòng)。如果我們?cè)谂渲弥行恼5臅r(shí)候冗余一份配置在本地,當(dāng)配置中心故障的時(shí)候從本地讀取配置,至少可以保證一部分客戶端程序能夠正常運(yùn)行。

{
 "Logging": {
 "LogLevel": {
  "Default": "Warning"
 }
 },
 "AllowedHosts": "*",
 "myconfigServer": "http://localhost:5000"
}

修改本地appsettings.json文件,添加myconfigServer的配置信息。

 public class MyConfigProvider : ConfigurationProvider
 {
  private string _serverAddress;
  public MyConfigProvider()
  {
   var jsonConfig = new JsonConfigurationSource();
   jsonConfig.FileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());
   jsonConfig.Path = "appsettings.json";
   var jsonProvider = new JsonConfigurationProvider(jsonConfig);
   jsonProvider.Load();

   jsonProvider.TryGet("myconfigServer", out string serverAddress);

   if (string.IsNullOrEmpty(serverAddress))
   {
    throw new Exception("Can not find myconfigServer's address from appsettings.json");
   }

   _serverAddress = serverAddress;
  }

  /// <summary>
  /// 嘗試從遠(yuǎn)程配置中心讀取配置信息,當(dāng)成功從配置中心讀取信息的時(shí)候把配置寫(xiě)到本地的myconfig.json文件中,當(dāng)配置中心無(wú)法訪問(wèn)的時(shí)候嘗試從本地文件恢復(fù)配置。
  /// </summary>
  public async override void Load()
  {
   var response = "";
   try
   {
    var client = new HttpClient();
    client.BaseAddress = new Uri(_serverAddress);
    response = await client.GetStringAsync("/api/configs");

    WriteToLocal(response);
   }
   catch (Exception ex)
   {
    //write err log
    response = ReadFromLocal();
   }

   if (string.IsNullOrEmpty(response))
   {
    throw new Exception("Can not request configs from remote config center .");
   }

   var configs = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(response);

   Data = new ConcurrentDictionary<string, string>();

   configs.ForEach(c =>
   {
    Data.Add(c);
   });
  }

  private void WriteToLocal(string resp)
  {
   var file = Directory.GetCurrentDirectory() + "/myconfig.json";
   File.WriteAllText(file,resp);
  }

  private string ReadFromLocal()
  {
   var file = Directory.GetCurrentDirectory() + "/myconfig.json";
   return File.ReadAllText(file);
  }
 }

關(guān)于如何在.Net Core中自定義配置源就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

文章題目:如何在.NetCore中自定義配置源-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://aaarwkj.com/article0/pjsoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站網(wǎng)站維護(hù)、網(wǎng)站建設(shè)微信小程序、做網(wǎng)站、營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
中文字幕伦理一区二区| 黄片无毛欧美在线观看| 亚洲伦理第一页中文字幕| 国产精品国语对白av处女| 综合久久精品亚洲天堂| 美女午夜福利一区二区| 开心五月婷婷六月丁香| 97免费观看在线观看| 欧美一区二区欧美精品| 青青草原免费在线观看| 国产精品欧美日韩精品| 国内揄拍国内精品少妇国| 亚洲精品日韩国产av| 亚洲三区久久婷婷激情| 欧美欧美一区二区三区| 国产三级自拍视频在线观看| 色综合视频二区偷拍在线| 日韩精品视频在线不卡播放| 久久这里有精品免费观看| 99在线视频午夜福利 | 久久亚洲综合精品人妻| 青青草视频在线针对华人| 国产综合一区二区三区视频| 亚洲男女内射在线视频| 国产一区二区精品久久岳√ | 日本不卡一区二区视频| 色呦呦一区二区三区视频| 日韩精品中文字幕欧美激情| 成人黄色大片免费看| 97久久精品国产成人影院| 人妻少妇被猛烈进入久久精品| 日韩精品国产专区一区| 综合资源网日韩天天操| 91亚洲精品国产一区| 97久久久人妻精品一区| 国内自拍视频一区高清视频| 未满18禁止入内在线观看| 在线免费观看成人午夜福利| 亚洲精品成人在线国产| 日韩欧美二区三区在线| 五月色婷婷六月色丁香|