如何在.NETCore中讀取配置文件-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)如何在.NET Core中讀取配置文件,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)10多年成都定制網(wǎng)站服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及高端網(wǎng)站定制服務(wù),成都定制網(wǎng)站及推廣,對(duì)成都石涼亭等多個(gè)方面擁有豐富的網(wǎng)站制作經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。

一. 引入擴(kuò)展 System.Configuration.ConfigurationManager

Nuget 下載擴(kuò)展,Install-Package System.Configuration.ConfigurationManager

如何在.NET Core中讀取配置文件

使用方式:添加配置文件App.config。讀取方式與原.NET Framework方式一致

優(yōu)點(diǎn):兼容.NET Framework 原有配置方式

缺點(diǎn):項(xiàng)目運(yùn)行過程中若需修改App.config文件,對(duì)項(xiàng)目中輸出的內(nèi)容沒有絲毫影響,Debug發(fā)現(xiàn)獲取到的值的確沒有變化,需要重新編譯才生效。

二. 引入擴(kuò)展 Microsoft.Extensions.Options.ConfigurationExtensions

Nuget 下載擴(kuò)展,

Install-Package Microsoft.Extensions.Options.ConfigurationExtensions

Install-Package Microsoft.Extensions.Configuration.FileExtensions

Install-Package Microsoft.Extensions.Configuration.Json

如何在.NET Core中讀取配置文件

如何在.NET Core中讀取配置文件

如何在.NET Core中讀取配置文件

使用方式:參考微軟官網(wǎng)

優(yōu)點(diǎn):可以讀取application.json中的配置參數(shù),不再使用XML可以說很好的貼近Core的設(shè)計(jì)理念

缺點(diǎn):運(yùn)行時(shí)修改json文件讀取到的內(nèi)容不會(huì)改變,但是至少重啟項(xiàng)目可以修改,若要運(yùn)行時(shí)候修改json文件監(jiān)聽實(shí)現(xiàn)監(jiān)聽變化。查看源碼,可以發(fā)現(xiàn) 雖然配置信息是通過AddSingleton注入的
但同時(shí)也注入了IOptionsChangeTokenSource ,故只需要在獲取配置信息時(shí)將IOptions<> 替換為 IOptionsMonitor<>(通過監(jiān)聽的Option來獲取信息),并通過 IOptionsMonitor<>.CurrentValue獲取即可實(shí)時(shí)獲取到新的配置信息(存在修改監(jiān)聽)

另外就是,這個(gè)方法采用的是反序列化的原理,也就是必須有一個(gè)跟配置文件對(duì)應(yīng)的實(shí)體類才可以,這個(gè)感覺比較雞肋,放棄。

三. 自定義擴(kuò)展方法,這個(gè)實(shí)現(xiàn)自己寫,原理是監(jiān)聽文件是否變更,來刷新Configuration 配置實(shí)現(xiàn)。

參考園友一個(gè)實(shí)現(xiàn),具體需要是否有效,要花時(shí)間實(shí)踐一下,原鏈接地址,代碼如下:

復(fù)制代碼


public class ConfigurationManager
 {
 /// <summary>
 /// 配置內(nèi)容
 /// </summary>
 private static NameValueCollection _configurationCollection = new NameValueCollection();

 /// <summary>
 /// 配置監(jiān)聽響應(yīng)鏈堆棧
 /// </summary>
 private static Stack<KeyValuePair<string, FileSystemWatcher>> FileListeners = new Stack<KeyValuePair<string, FileSystemWatcher>>();

 /// <summary>
 /// 默認(rèn)路徑
 /// </summary>
 private static string _defaultPath = Directory.GetCurrentDirectory() + "\\appsettings.json";

 /// <summary>
 /// 最終配置文件路徑
 /// </summary>
 private static string _configPath = null;

 /// <summary>
 /// 配置節(jié)點(diǎn)關(guān)鍵字
 /// </summary>
 private static string _configSection = "AppSettings";

 /// <summary>
 /// 配置外連接的后綴
 /// </summary>
 private static string _configUrlPostfix = "Url";

 /// <summary>
 /// 最終修改時(shí)間戳
 /// </summary>
 private static long _timeStamp = 0L;

 /// <summary>
 /// 配置外鏈關(guān)鍵詞,例如:AppSettings.Url
 /// </summary>
 private static string _configUrlSection { get { return _configSection + "." + _configUrlPostfix; } }


 static ConfigurationManager()
 {
  ConfigFinder(_defaultPath);
 }

 /// <summary>
 /// 確定配置文件路徑
 /// </summary>
 private static void ConfigFinder(string Path)
 {
  _configPath = Path;
  JObject config_json = new JObject();
  while (config_json != null)
  {
  config_json = null;
  FileInfo config_info = new FileInfo(_configPath);
  if (!config_info.Exists) break;

  FileListeners.Push(CreateListener(config_info));
  config_json = LoadJsonFile(_configPath);
  if (config_json[_configUrlSection] != null)
   _configPath = config_json[_configUrlSection].ToString();
  else break;
  }

  if (config_json == null || config_json[_configSection] == null) return;

  LoadConfiguration();
 }

 /// <summary>
 /// 讀取配置文件內(nèi)容
 /// </summary>
 private static void LoadConfiguration()
 {
  FileInfo config = new FileInfo(_configPath);
  var configColltion = new NameValueCollection();
  JObject config_object = LoadJsonFile(_configPath);
  if (config_object == null || !(config_object is JObject)) return;
  
  if (config_object[_configSection]!=null)
  {
  foreach (JProperty prop in config_object[_configSection])
  {
   configColltion[prop.Name] = prop.Value.ToString();
  }
  }
  
  _configurationCollection = configColltion;
 }

 /// <summary>
 /// 解析Json文件
 /// </summary>
 /// <param name="FilePath">文件路徑</param>
 /// <returns></returns>
 private static JObject LoadJsonFile(string FilePath)
 {
  JObject config_object = null;
  try
  {
  StreamReader sr = new StreamReader(FilePath, Encoding.Default);
  config_object = JObject.Parse(sr.ReadToEnd());
  sr.Close();
  }
  catch { }
  return config_object;
 }

 /// <summary>
 /// 添加監(jiān)聽樹節(jié)點(diǎn)
 /// </summary>
 /// <param name="info"></param>
 /// <returns></returns>
 private static KeyValuePair<string, FileSystemWatcher> CreateListener(FileInfo info)
 {

  FileSystemWatcher watcher = new FileSystemWatcher();
  watcher.BeginInit();
  watcher.Path = info.DirectoryName;
  watcher.Filter = info.Name;
  watcher.IncludeSubdirectories = false;
  watcher.EnableRaisingEvents = true;
  watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Size;
  watcher.Changed += new FileSystemEventHandler(ConfigChangeListener);
  watcher.EndInit();

  return new KeyValuePair<string, FileSystemWatcher>(info.FullName, watcher);
  
 }

 private static void ConfigChangeListener(object sender, FileSystemEventArgs e)
 {
  long time = TimeStamp();
  lock (FileListeners)
  {
  if (time > _timeStamp)
  {
   _timeStamp = time;
   if (e.FullPath != _configPath || e.FullPath == _defaultPath)
   {
   while (FileListeners.Count > 0)
   {
    var listener = FileListeners.Pop();
    listener.Value.Dispose();
    if (listener.Key == e.FullPath) break;
   }
   ConfigFinder(e.FullPath);
   }
   else
   {
   LoadConfiguration();
   }
  }
  }
 }

 private static long TimeStamp()
 {
  return (long)((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds * 100);
 }

 private static string c_configSection = null;
 public static string ConfigSection
 {
  get { return _configSection; }
  set { c_configSection = value; }
 }


 private static string c_configUrlPostfix = null;
 public static string ConfigUrlPostfix
 {
  get { return _configUrlPostfix; }
  set { c_configUrlPostfix = value; }
 }

 private static string c_defaultPath = null;
 public static string DefaultPath
 {
  get { return _defaultPath; }
  set { c_defaultPath = value; }
 }

 public static NameValueCollection AppSettings
 {
  get { return _configurationCollection; }
 }

 /// <summary>
 /// 手動(dòng)刷新配置,修改配置后,請(qǐng)手動(dòng)調(diào)用此方法,以便更新配置參數(shù)
 /// </summary>
 public static void RefreshConfiguration()
 {
  lock (FileListeners)
  {
  //修改配置
  if (c_configSection != null) { _configSection = c_configSection; c_configSection = null; }
  if (c_configUrlPostfix != null) { _configUrlPostfix = c_configUrlPostfix; c_configUrlPostfix = null; }
  if (c_defaultPath != null) { _defaultPath = c_defaultPath; c_defaultPath = null; }
  //釋放掉全部監(jiān)聽響應(yīng)鏈
  while (FileListeners.Count > 0)
   FileListeners.Pop().Value.Dispose();
  ConfigFinder(_defaultPath);
  }
 }

 }

看完上述內(nèi)容,你們對(duì)如何在.NET Core中讀取配置文件有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

名稱欄目:如何在.NETCore中讀取配置文件-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://muchs.cn/article34/eippe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、App開發(fā)、動(dòng)態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、虛擬主機(jī)、靜態(tài)網(wǎng)站

廣告

聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作