【问题标题】:Error while trying to get connectionString from web.config尝试从 web.config 获取 connectionString 时出错
【发布时间】:2017-03-27 21:49:17
【问题描述】:

我有一个 SelfHosted WCF 服务,当我尝试从 web.config 文件中读取连接字符串时

string conn = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;

然后我得到一个错误:

对象引用未设置为对象的实例。

我的 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>
  ...

我尝试使用WebConfigurationManager,如question 中所述,但没有帮助。

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

【问题讨论】:

  • 您确定错误来自该行并且您的服务正在加载的 web.config 文件是您认为的那个吗?
  • @MarcoScabbiolo 是的,我确定。错误发生在该行

标签: c# wcf web-config


【解决方案1】:

更安全的设置:

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 中进行设置,在属性窗口中将 Copy to Output Directory 设置为 Copy always 并重新构建您的应用程序。

【讨论】:

  • 谢谢你,很遗憾,它没有解决问题,但我会使用这个检查。 +1
【解决方案2】:

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

问题是我在web.config 文件中的第一个项目中添加了connectionStrings

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

【讨论】:

    【解决方案3】:

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

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

    但是,如果您的问题与 Asp.net 有关,并且想要享受它提供的特权,例如访问 web.config,您可能需要在下面添加一些配置。您提到自托管,我认为它应该是 app.config 而不是 web.config 对吗? “我有理论认为你的 wcf 与 Asp.net 有关,你的问题中没有提到,如果我错了,请纠正我。”

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

    【讨论】:

    • 谢谢,但没有帮助(
    • 您提到自托管,我认为应该是 app.config 而不是 web.config?
    • 是的,你是对的。但是我已经解决了这个问题,请看我的回答。谢谢。
    【解决方案4】:

    如果您使用 .NET 4.5+ 并且可以访问 C# 6.0,则可以使用空合并运算符 (?) 将 conn 设置为空,而不会自动引发异常:

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

    这与原始代码的唯一不同之处在于右括号后的附加问号。当ConfigurationManager.ConnectionStrings["MyConnectionString"] 为空时,当您尝试访问空对象的ConnectionString 属性时,不会自动引发异常。

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

    // 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2020-07-25
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多