使用ConfigurationManager从Web.Config中读取密钥

twa*_*wal 272 c# asp.net-mvc

我试图从Web.config与web层不同的层中读取文件中的键(相同的解决方案)

这是我正在尝试的:

string userName = System.Configuration.ConfigurationManager.AppSettings["PFUserName"];
string password = System.Configuration.ConfigurationManager.AppSettings["PFPassWord"];
Run Code Online (Sandbox Code Playgroud)

这是我appSettingsWeb.config文件中:

<configuration>
   ....
   <appSettings>
      <add key="PFUserName" value="myusername"/>
      <add key="PFPassWord" value="mypassword"/>
   </appSettings>
   ....
</configuration>
Run Code Online (Sandbox Code Playgroud)

当我调试的代码usernamepassword只是null,所以它是没有得到键的值.

读这些值我做错了什么?

Hec*_*rea 462

请尝试使用WebConfigurationManager类.例如:

string userName = WebConfigurationManager.AppSettings["PFUserName"]
Run Code Online (Sandbox Code Playgroud)

  • 您确定设置在正确的web.config上吗?(在将"我的"值转储到"Views"文件夹下的web.config之前,我犯了一个错误,并且失去了大量时间来解决为什么它没有按预期工作. (21认同)
  • 谢谢,您可以删除ToString,因为AppSettings索引器已经返回字符串. (4认同)
  • 谢谢你的回答,我按照你的推荐尝试了,但仍然得到了相同的结果.我实际上现在在ToString()上得到一个NullReferenceException (2认同)

yog*_*gee 39

  var url = ConfigurationManager.AppSettings["ServiceProviderUrl"];
Run Code Online (Sandbox Code Playgroud)

  • 正确答案.`ToString()`虽然多余. (12认同)
  • 如果值不在app config中,则ToString可能很危险.最好捕获返回的对象并在解析之前测试null.当"mysettings"不在配置中时尝试运行它,你会看到异常弹出.相反,下面的内容可能会更安全...... string key ="mysettings"; string value = ConfigurationManager.AppSettings [key]; if(value == null)value ="unknown value"; (8认同)
  • @JoeHealy您可以使用空合并运算符来缩短它并提高清晰度:`string value = ConfigurationManager.AppSettings [key]?“未知值” (2认同)

mat*_*scb 6

我发现这个解决方案非常有用.它使用C#4.0 DynamicObject来包装ConfigurationManager.所以不要像这样访问值:

 WebConfigurationManager.AppSettings["PFUserName"]
Run Code Online (Sandbox Code Playgroud)

您将它们作为属性访问:

dynamic appSettings = new AppSettingsWrapper();
Console.WriteLine(appSettings.PFUserName);  
Run Code Online (Sandbox Code Playgroud)

编辑:添加代码片段以防万一链接变得陈旧:

public class AppSettingsWrapper : DynamicObject
{
     private NameValueCollection _items;

    public AppSettingsWrapper()
    {
        _items = ConfigurationManager.AppSettings;
    }

     public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = _items[binder.Name];
        return result != null;
    }
}
Run Code Online (Sandbox Code Playgroud)


Sab*_*ber 6

如果调用者是另一个项目,则应该在调用者项目中编写配置而不是被调用者.