使用ConfigurationManager从Web.Config读取密钥


284

我正在尝试从Web.config与Web层不同的层中从文件中读取密钥(相同的解决方案)

这是我正在尝试的:

string userName = System.Configuration.ConfigurationManager.AppSettings["PFUserName"];
string password = System.Configuration.ConfigurationManager.AppSettings["PFPassWord"];

这是我appSettingsWeb.config文件:

<configuration>
   ....
   <appSettings>
      <add key="PFUserName" value="myusername"/>
      <add key="PFPassWord" value="mypassword"/>
   </appSettings>
   ....
</configuration>

当我调试代码usernamepasswordjust时null,因此它没有获取键的值。

我读这些值错在做什么?


您的网站如何访问第二个项目?
Dan Atkinson

13
您的语法正确。您可能编辑了错误的web.config文件,这就是它返回的原因NULL。最新评论,但没有人指出。
Hammad Khan 2014年

1
这就是我发生的事情,当时我在Views web.config中。
JQII 2014年

1
仅Web项目有权访问System.Configuration.ConfigurationManager.AppSettings对象。其他层无法访问此对象,因为它们未实现System.Web。
Hashim Akhtar

Answers:


475

尝试改用WebConfigurationManager类。例如:

string userName = WebConfigurationManager.AppSettings["PFUserName"]

2
感谢您的回答,我按照您的建议进行了尝试,但仍得到相同的结果。我现在实际上在ToString()上收到了NullReferenceException
11年

如果收到null异常,则表示找不到该设置。尝试执行以下操作:“对象x = WebConfigurationManager.AppSettings [” PFUserName“];” 并且您可能会得到一个空值,这意味着它没有找到所请求的设置。
赫克托·科雷亚

21
您确定设置在正确的web.config上吗?(我做了错误的“视图”文件夹下的web.config中倾倒了我的价值观之前,为什么它如预期的工作不丢一吨的时间排除故障。
赫克托·科雷亚

大。我很高兴做到了。
Hector Correa

4
谢谢,您可以删除ToString,因为AppSettings索引器已经返回了字符串。
Ido Ran

43
  var url = ConfigurationManager.AppSettings["ServiceProviderUrl"];

12
正确答案。ToString()虽然是多余的。
anar khalilov

9
如果值不在应用程序配置中,则ToString可能很危险。最好在解决之前捕获返回的对象并测试null。当配置中没有“ mysettings”时,尝试运行它,您会看到异常弹出消息。相反,下面的内容可能更安全... string key =“ mysettings”; 字符串值= ConfigurationManager.AppSettings [key]; if(value == null)value =“未知值”;
Joe Healy

1
true,因为它是字符串,所以不需要.ToString()
Rola 2016年

2
@JoeHealy您可以使用空合并运算符来缩短它并提高清晰度:string value = ConfigurationManager.AppSettings[key] ?? "unknown value"
Zenexer '16

我想知道这个答案和OP问题中的代码有什么区别!他们不一样吗?
user1451111 '19

6

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


6

我发现此解决方案很有帮助。它使用C#4.0 DynamicObject来包装ConfigurationManager。因此,与其访问像这样的值:

 WebConfigurationManager.AppSettings["PFUserName"]

您可以将它们作为属性访问:

dynamic appSettings = new AppSettingsWrapper();
Console.WriteLine(appSettings.PFUserName);  

编辑:添加代码段以防链接失效:

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

2

完整路径是

System.Configuration.ConfigurationManager.AppSettings["KeyName"]

2

将有两个Web.config文件。我认为您可能对这两个文件感到困惑。

检查此图像:

点击此链接并检查此图像

在此图像中,您可以看到两个Web.config文件。您应该将常量添加到项目文件夹中而不是views文件夹中的常量

希望这对您有帮助



1

您也可以尝试以下行从app.config文件中获取字符串值。

var strName= ConfigurationManager.AppSettings["stringName"];

0

假设在.config文件中进行以下设置:

<configuration>
   <appSettings>
     <add key="PFUserName" value="myusername"/>
     <add key="PFPassWord" value="mypassword"/>
   </appSettings> 
</configuration>

尝试这个:

public class myController : Controller
{
    NameValueCollection myKeys = ConfigurationManager.AppSettings;

    public void MyMethod()
    {
        var myUsername = myKeys["PFUserName"];
        var myPassword = myKeys["PFPassWord"];
    }
}

-5

抱歉,我尚未对此进行测试,但我认为它是这样完成的:

var filemap = new System.Configuration.ExeConfigurationFileMap();            
System.Configuration.Configuration config =  System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(filemap, System.Configuration.ConfigurationUserLevel.None);

//usage: config.AppSettings["xxx"]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.