如何提供可通过 asp.net 5 中的 ConfigurationManager 访问的设置?
How can I provide settings that can be accessed through ConfigurationManager in asp.net 5?
如何在 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"]
returns 空。相反,ConfigurationManager.ConnectionStrings
仅包含 machine.config 默认值。
他们似乎决定完全弃用 System.Configuration。
所以假设(我猜)如果你是一个从 web/exe.config(通过 ConfigurationManager
)读取一些配置的库,那么你将不得不想出自己的配置语法,阅读它来自 Startup
中的 json/xml/whatever 并通过它自己的 api 初始化库。这有点像控制反转。
我向团队询问了此 issue 中更清晰的文档。
目前,我使用了 this answer 中的 ResetConfigMechanism
和上面评论中提到的 AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
设置的组合。
我觉得这个 answer(这更像是一种解决方法),如果其他人有更好的解决方案,我很乐意接受他们的回答。
在您需要正确的配置文件之前,只需访问您应用中的 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);
}
}
如何在 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"]
returns 空。相反,ConfigurationManager.ConnectionStrings
仅包含 machine.config 默认值。
他们似乎决定完全弃用 System.Configuration。
所以假设(我猜)如果你是一个从 web/exe.config(通过 ConfigurationManager
)读取一些配置的库,那么你将不得不想出自己的配置语法,阅读它来自 Startup
中的 json/xml/whatever 并通过它自己的 api 初始化库。这有点像控制反转。
我向团队询问了此 issue 中更清晰的文档。
目前,我使用了 this answer 中的 ResetConfigMechanism
和上面评论中提到的 AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
设置的组合。
我觉得这个 answer(这更像是一种解决方法),如果其他人有更好的解决方案,我很乐意接受他们的回答。
在您需要正确的配置文件之前,只需访问您应用中的 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);
}
}