如何在asp.net 5中提供可通过ConfigurationManager
访问的设置?
我正在使用不支持新Microsoft.Framework.ConfigurationModel
的旧软件包,并期待ConfigurationManager获取连接字符串,应用程序设置甚至配置部分。将app.config添加到项目似乎没有任何效果。
例如,app.config:
<configuration>
<connectionStrings>
<add name="logging" connectionString="Server=.\SQLExpress;Database=logging;Trusted_Connection=True;"/>
</connectionStrings>
</configuration>
ConfigurationManager.ConnectionStrings["logging"]
返回null。相反,ConfigurationManager.ConnectionStrings
仅包含machine.config默认值。
答案 0 :(得分:2)
他们似乎决定弃用System.Configuration。
所以我猜想(如果你是一个从web / exe.config读取一些配置的lib(通过ConfigurationManager
)那么你必须拿出自己的配置语法,从中读取它json / xml / Startup
中的任何内容,并通过它自己的api初始化lib。这有点颠倒了控制。
我向团队询问了issue中更清晰的文档。
答案 1 :(得分:2)
目前,我使用了this answer中的ResetConfigMechanism
和评论中提到的AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
设置的组合。
我认为这不是一个令人满意的答案(它更像是一种解决方法),并且如果他们有更好的解决方案,我愿意接受别人的答案。
在您的配置文件正确无误之前,只需访问应用中的某个地方ConfigurationFixture.Current
即可!
using System;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Reflection;
public sealed class ConfigurationFixture
{
public static ConfigurationFixture Current = new ConfigurationFixture();
private ConfigurationFixture()
{
// Run at start
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App.config"));
ResetConfigMechanism();
}
private static void ResetConfigMechanism()
{
typeof(ConfigurationManager)
.GetField("s_initState", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, 0);
typeof(ConfigurationManager)
.GetField("s_configSystem", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, null);
typeof(ConfigurationManager)
.Assembly.GetTypes()
.Where(x => x.FullName ==
"System.Configuration.ClientConfigPaths")
.First()
.GetField("s_current", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, null);
}
}