.net core读取配置文件appsetting.json

写代码的相声演员 2017-09-06 05:44:16
由于Core移除了ConfigurationManager.Appsetting["title"]这个方法,我现在不知道该怎么在控制器中读取配置文件了,例如项目的标题。

尝试过三个方式。
一、引入扩展System.Configuration.ConfigurationManager
这个扩展可以使Core使用跟原来一样的方法,来读取app.config中的配置参数。
问题在于,一旦项目编译完了,无论如何修改app.config文件的内容,ConfigurationManager读取到的值都不会发生变化,重启项目都不好用,只能修改完重新编译。
我没看源码,但是我都怀疑是不是这个扩展把配置文件的值直接编译进dll里了

二、引入扩展Microsoft.Extensions.Options.ConfigurationExtensions
配置参数可以直接写在appsettings.json里面了,但是这个方法需要在startup中注册。并且需要有跟配置文件配套的实体类才可以,感觉比较鸡肋。
缺点和上一个一样,在项目运行的时候,无论如何修改配置文件,读取到的值都不会改变,唯一不同的是,重启项目可以解决。
感觉应该是在项目启动的时候创建里了一个静态实例。

三、硬编码
每次尝试读取配置文件的时候,使用Newtonsoft.Json从新解析并尝试返回配置内容。
这个方法是能满足要求了,但是系统开销似乎不小,而且如果我一次请求要多次调用配置文件,就会解析多次。想过做缓存,每次判断文件是否修改。没修改就用缓存, 修改了就从新解析。

这三个方法似乎都有问题,但是我现在就纠结于前两种方法他不能随时改变配置文件的问题。

请大神们给点思路
...全文
9844 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdnfan 2020-10-27
  • 打赏
  • 举报
回复
这都什么时候的帖子,现在netcore自带取值方法非常方便,可以直接使用如下代码取值:
String val = configuration.GetValue<string>("key","defaultValue")
当然前提是你已经通过注入获取到configuration ,如果不在注入的情况下使用,可以参见这里,其实就是把开源的部分代码截取出来用而已 https://www.lebang2020.cn/details/20101932pcdy00.html
tokeyro 2020-02-18
  • 打赏
  • 举报
回复
配置文件:appsettings.json
{
"Jwt": {
"Issuer": "Issuer",
"Audience": "Audience",
"SigningKey": "EF1DA5B7-C4FA-4240-B997-7D1701BF9BE2"
}
}

JWT 信息类
public class CML_JwtConfig
{
public string Issuer { get; set; }
public string Audience { get; set; }
public string SigningKey { get; set; }
}

Startup.cs里
public void ConfigureServices(IServiceCollection services)
{
var jwtconfig = Configuration.GetSection("Jwt").Get<CML_JwtConfig>();

//jwtconfig.Issuer
}

不知道是不是你想要的。
yeweidn 2019-01-14
  • 打赏
  • 举报
回复
我也遇到和你一样问题,.net core读取配置文件appsetting.json 确实鸡助,也没有返回dynamic的操作,正打算自己写个,刚好看到你写的,你的内容通过JsonConvert 反序列化后可以这样 return JsonConvert.DeserializeObject<dynamic>(jsonstr),
  • 打赏
  • 举报
回复
还是没人理我,心凉了,关于昨天发的那个代码,忽然发现图样图森破。从新写了一个。 答案在这里 http://www.cnblogs.com/kasimlz/p/7515810.html 转战博客园,CSDN心彻底凉透了
  • 打赏
  • 举报
回复
好吧,没人理我,找了好几种方法,都不太好使。最后才是采取的硬编码方法。 贴一下代码,大佬们如果有更好的建议,希望给我提提

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Specialized;
using System.IO;
using System.Text;

namespace Common.Configuration
{
    public class ConfigurationManager
    {
        private static NameValueCollection _configurationCollection;
        private static DateTime _lastWriteTime;
        public static bool _configFileExist;
        public static string _defaultPath = "/appsettings.json";

        static ConfigurationManager()
        {
            _lastWriteTime = DateTime.MinValue;
            _configurationCollection = new NameValueCollection();
        }

        private static void ReadJosnConfig(string filePath = null)
        {
            if (string.IsNullOrEmpty(filePath)) filePath = Directory.GetCurrentDirectory() + _defaultPath;


            FileInfo config = new FileInfo(filePath);
            if (!(_configFileExist = config.Exists)) return;

            //if (_lastWriteTime == config.LastWriteTime) return;

            _configurationCollection.Clear();
            StreamReader sr = new StreamReader(filePath, Encoding.Default);
            JObject config_object = JObject.Parse(sr.ReadToEnd());
            sr.Close();
            if (config_object == null || !(config_object is JObject)) return;

            if (config_object["appSettings.Url"] != null && !string.IsNullOrEmpty(config_object["appSettings.Url"].ToString()))
            {
                ReadJosnConfig(config_object["appSettings.Url"].ToString());
            }
            else
            {
                foreach (JProperty prop in config_object["AppSettings"])
                {
                    _configurationCollection[prop.Name] = prop.Value.ToString();
                }
            }
        }

        public static bool ConfigFileExist { get { return _configFileExist; } }

        public static NameValueCollection AppSettings
        {
            get
            {
                ReadJosnConfig();
                return _configFileExist ? _configurationCollection : new NameValueCollection();
            }
        }

    }
}

其中有一行我给注释掉了(应该是挺明显的)。 本意是每次获取配置文件的修改时间,比对与现在的是否一致,不一致则从新读取。 但是加了外部配置文件(appSettings.Url)以后,在以时间作为一个基准就不太合适了。会被原始文件给卡住。所以暂时注掉了。后来发现这么做也不太合适。在并发的时候估计会出现读取锁的问题。 不过测试了一下效率还可以,再改改

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧