尝试从 web.config 获取 connectionString 时出错

Error while trying to get connectionString from web.config

我有一个 SelfHosted WCF 服务,当我试图从 web.config 文件

中读取连接字符串时
string conn = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;

然后我得到一个错误:

Object reference not set to an instance of an object.

我的Web.config:

<configuration>
  <connectionStrings>
    <add name="MyConnectionString" connectionString="server=192.168.1.2;database=TestDB;uid=sa;pwd=saas" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <system.web>
  ...

我尝试按照 question 中的描述使用 WebConfigurationManager,但没有帮助。

为什么我无法从 web.config 获取 connectionString?

更安全的设置:

ConnectionStringSettings conn = ConfigurationManager.ConnectionStrings["MyConnectionString"];
if (conn == null || string.IsNullOrEmpty(conn.ConnectionString)) 
{
    throw new Exception("Couln't find connection string in web.config.");
}
myConnString = conn.ConnectionString

您也可以尝试在 visual studio 中设置 select 配置文件后,在属性 window 中将 Copy to Output Directory 设置为 Copy always 并重建你的申请。

在我的 WCF 服务中,我使用这种方式获取连接字符串。

ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString()

但是如果您的问题与 Asp.net 有关并且想享受它提供的特权,例如访问 web.config,您可能需要在下面添加一些配置。你提到了自托管,我认为它应该是 app.config 而不是 web.config 对吗? "I have theory that your wcf has something to do with Asp.net, which is not mentioned in you question, Correct me if I'm wrong."

<system.serviceModel>
...
    <serviceHostingEnvironment **aspNetCompatibilityEnabled="true"**/>
...
</system.serviceModel>

我找到了解决方案。这都是我的错。在 VS 解决方案中,我有 2 个项目:第一个(WCF 服务)和第二个(托管我的服务的控制台应用程序)。

问题是我将 connectionStrings 添加到 web.config 文件中的第一个项目!

connectionStrings 添加到 app.config 文件中的第二个项目后,一切正常

如果您使用的是 .NET 4.5+ 并且可以访问 C# 6.0,则可以使用 null 合并运算符 (?) 将 conn 设置为 null 而不会自动抛出一个例外:

string conn = ConfigurationManager.ConnectionStrings["MyConnectionString"]?.ConnectionString;
//-------------------------------------------------------------------HERE-^-HERE-------------

这与您的原始代码唯一不同的地方是右括号后的附加问号。当 ConfigurationManager.ConnectionStrings["MyConnectionString"] 为 null 时,当您尝试访问 null 对象上的 ConnectionString 属性 时,不会自动抛出异常。

据我所知,上面使用空合并运算符的语句在功能上等同于以下代码:

// First, see if you can get a reference to the main object in ```Web.config```.
ConnectionStringSettingsCollection connStringSettingsCollection = ConfigurationManager.ConnectionStrings["MyConnectionString"];

// Next, try to get the value -- but don't throw an exception if it can't be retreived.
string conn;

if (connectionStringsInfo == null)
    conn = default(string);
else
    conn = connectionStringsInfo.ConnectionString;