• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > .NET Core读取配置文件方式详细总结

.NET Core读取配置文件方式详细总结

作者:戈多编程 字体:[增加 减小] 来源:互联网 时间:2018-08-20

戈多编程 通过本文主要向大家介绍了.NET,Core读取配置文件方式,.NET,Core读取配置文件,.NET,Core读取配置等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

基于.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 配置实现。

参考园友一个实现,具体需要是否有效,要花时间实践一下,原链接地址,代码如下:

复制代码

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);
  }
 }

 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Asp.net SignalR 应用并实现群聊功能 开源代码
  • asp.net动态更新
  • asp.net利用母版制作页脚效果
  • Asp.Net服务器发送HTTP标头后无法设置内容类型的问题解决
  • 使用asp.net mvc,boostrap及knockout.js开发微信自定义菜单编辑工具(推荐)
  • 详解ASP.NET MVC 常用扩展点:过滤器、模型绑定
  • ASP.NET Core发送邮件的方法
  • 在ASP.NET Core 中发送邮件的实现方法(必看篇)
  • ASP.NET MVC从视图传参到控制器的几种形式
  • .net core使用redis基于StackExchange.Redis

相关文章

  • 2017-05-11asp.net log4net的使用方法
  • 2017-05-11ASP.NET热点问题解答14个
  • 2017-05-11使用ASP.NET一般处理程序或WebService返回JSON的实现代码
  • 2017-05-11ASP.NET MVC 4 中的JSON数据交互的方法
  • 2017-05-11asp.net验证提示美化效果代码(打包下载)
  • 2017-05-11Asp.net Socket客户端(远程发送和接收数据)
  • 2017-05-11HttpRequest的QueryString属性 的一点认识
  • 2018-08-20Jexus部署.Net Core项目
  • 2017-05-11GridView多层嵌套和折叠与展开(修改适合自己使用)
  • 2017-05-11asp.net 防止用户通过后退按钮重复提交表单

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 如何在WebForm中使用javascript防止连打(双击)
    • 详解Asp.Net Core 2.1+的视图缓存(响应缓存)
    • ASP.NET操作Word的IIS权限设置
    • WPF实现简单的跑马灯效果
    • ASP.NET笔记之Calender的使用说明
    • 适用与firefox ASP.NET无刷新二级联动下拉列表
    • GridView分页代码简单万能实用
    • 在asp.net下实现Option条目中填充前导空格的方法
    • ASP.NET服务器控件开发(1)封装html
    • 浅谈如何在ASP.NET Core中实现一个基础的身份认证

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有