NET Core读取配置文件方式详细总结
这篇文章主要为大家详细总结了.NET Core读取配置文件方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
基于.NET Core的跨平台开发,配置文件与之前.NET Framework采用xml的config文件不同,目前主要是采用json文件键值对配置方式读取。
参考网上相关资料总结如下:
一. 引入扩展 System.Configuration.ConfigurationManager
Nuget 下载扩展,Install-Package System.Configuration.ConfigurationManager
使用方式:添加配置文件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
使用方式:参考微软官网
优点:可以读取application.json中的配置参数,不再使用XML可以说很好的贴近Core的设计理念
缺点:运行时修改json文件读取到的内容不会改变,但是至少重启项目可以修改,若要运行时候修改json文件监听实现监听变化。查看源码,可以发现 虽然配置信息是通过AddSingleton注入的
但同时也注入了IOptionsChangeTokenSource ,故只需要在获取配置信息时将IOptions<> 替换为 IOptionsMonitor<>(通过监听的Option来获取信息),并通过 IOptionsMonitor<>.CurrentValue获取即可实时获取到最新的配置信息(存在修改监听)
另外就是,这个方法采用的是反序列化的原理,也就是必须有一个跟配置文件对应的实体类才可以,这个感觉比较鸡肋,放弃。
三. 自定义扩展方法,这个实现自己写,原理是监听文件是否变更,来刷新Configuration 配置实现。
参考园友一个实现,具体需要是否有效,要花时间实践一下,原链接地址,代码如下:
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 | 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); } } } |
以上就是本文的全部内容,希望对大家的学习有所帮助