configuration.GetConnectionString(“MyConn”)得到空值?

时间:2017-08-29 20:52:32

标签: c# .net-core

在以下控制台应用程序(.Net core 2.0)中,conn获得了空值。

var services = new ServiceCollection();

IConfigurationRoot configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddXmlFile("App.config", optional: false).Build();

services.AddSingleton(configuration);

var conn = configuration.GetConnectionString("MyConn"); // conn is null

以下是App.config。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="MyConn" connectionString="....." />
  </connectionStrings>
  <Settings>
    <Name>Test</Name>
  </Settings>
</configuration>

有些代码可以成功获得Name Settings的值(“测试”)。

更新

在分配conn之后,我有以下代码来获取XML部分的<Settings>部分,它可以获得值“Test”。

var myOptions = new MyOptions();
configuration.GetSection("Settings").Bind(myOptions);

2 个答案:

答案 0 :(得分:4)

请参阅GetConnectionString只是extension method,只需执行以下操作:

public static string GetConnectionString(this IConfiguration configuration, string name)
{
    return configuration?.GetSection("ConnectionStrings")?[name];
}

如果在调试过程中检查Data中的configuration.Providers 你会发现以下其他键/值:

key: "connectionStrings:add:MyConn:name" | value: "MyConn"
key: "connectionStrings:add:MyConn:connectionString" | value: "....."

这就是你获得null值的原因。

因此,使用当前的XML结构,您只需执行以下操作:

var connString = configuration.GetValue<string>("connectionStrings:add:MyConn:connectionString", string.Empty);

或者将您的XML修改为

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <MyConn>conn_string_here</MyConn>
  </connectionStrings>
</configuration>

并使用

var conn = configuration.GetConnectionString("MyConn");
// conn value will be "conn_string_here"

答案 1 :(得分:2)

.NET Core的配置不会将.config文件与XML文件区别开来。也就是说,你不能通过add标签添加连接字符串“旧方法”,因为这会创建非常奇怪的配置键:

Configuration provider internals

如果要使用XML文件,指定连接字符串的正确方法是:

<connectionStrings>
  <MyConn>....</MyConn>
</connectionStrings>