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

溫馨提示×

溫馨提示×

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

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

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

發布時間:2021-05-25 16:22:50 來源:億速云 閱讀:342 作者:Leah 欄目:開發技術

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

一. 引入擴展 System.Configuration.ConfigurationManager

Nuget 下載擴展,Install-Package System.Configuration.ConfigurationManager

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

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

優點:兼容.NET Framework 原有配置方式

缺點:項目運行過程中若需修改App.config文件,對項目中輸出的內容沒有絲毫影響,Debug發現獲取到的值的確沒有變化,需要重新編譯才生效。

二. 引入擴展 Microsoft.Extensions.Options.ConfigurationExtensions

Nuget 下載擴展,

Install-Package Microsoft.Extensions.Options.ConfigurationExtensions

Install-Package Microsoft.Extensions.Configuration.FileExtensions

Install-Package Microsoft.Extensions.Configuration.Json

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

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

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

使用方式:參考微軟官網

優點:可以讀取application.json中的配置參數,不再使用XML可以說很好的貼近Core的設計理念

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

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

三. 自定義擴展方法,這個實現自己寫,原理是監聽文件是否變更,來刷新Configuration 配置實現。

參考園友一個實現,具體需要是否有效,要花時間實踐一下,原鏈接地址,代碼如下:

復制代碼

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

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

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

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

 /// <summary>
 /// 配置節點關鍵字
 /// </summary>
 private static string _configSection = "AppSettings";

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

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

 /// <summary>
 /// 配置外鏈關鍵詞,例如: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>
 /// 讀取配置文件內容
 /// </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>
 /// 添加監聽樹節點
 /// </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>
 /// 手動刷新配置,修改配置后,請手動調用此方法,以便更新配置參數
 /// </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; }
  //釋放掉全部監聽響應鏈
  while (FileListeners.Count > 0)
   FileListeners.Pop().Value.Dispose();
  ConfigFinder(_defaultPath);
  }
 }

 }

看完上述內容,你們對如何在.NET Core中讀取配置文件有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

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

AI

万全县| 庆云县| 苏尼特右旗| 靖西县| 蓬莱市| 梧州市| 曲水县| 顺义区| 白水县| 德昌县| 桑日县| 堆龙德庆县| 南木林县| 张家口市| 竹溪县| 保康县| 深州市| 赤水市| 宝应县| 乌鲁木齐市| 刚察县| 肇庆市| 福州市| 科尔| 周口市| 上杭县| 德令哈市| 宣威市| 南汇区| 富民县| 中西区| 登封市| 弥勒县| 盐山县| 三门县| 腾冲县| 隆子县| 皮山县| 贵德县| 阿鲁科尔沁旗| 阳原县|