【问题标题】:Reading a key from the Web.Config using ConfigurationManager使用 ConfigurationManager 从 Web.Config 读取密钥
【发布时间】:2021-06-14 15:18:17
【问题描述】:

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

这是我正在尝试的:

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

这是我在Web.config 文件中的appSettings

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

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

读取这些值我做错了什么?

【问题讨论】:

  • 您的网站如何访问第二个项目?
  • 你的语法是正确的。您可能编辑了错误的 web.config 文件,这就是它返回 NULL 的原因。迟到的评论,但没有人指出这一点。
  • 这就是发生在我身上的事情,我在 Views web.config 中。
  • 只有 Web 项目可以访问 System.Configuration.ConfigurationManager.AppSettings 对象。其他层无法访问此对象,因为它们没有实现 System.Web。

标签: c# asp.net-mvc


【解决方案1】:

尝试改用 WebConfigurationManager 类。例如:

string userName = WebConfigurationManager.AppSettings["PFUserName"]

【讨论】:

  • 感谢您的回答,我按照您的建议尝试了,仍然得到相同的结果。实际上,我现在在 ToString() 上得到了 NullReferenceException
  • 如果你得到一个空异常,这意味着没有找到设置。尝试执行以下操作:“object x = WebConfigurationManager.AppSettings["PFUserName"];"你可能会得到一个空值,这意味着它没有找到请求的设置。
  • 您确定设置在正确的 web.config 上吗? (我之前犯了一个错误,将我的值转储到“Views”文件夹下的 web.config 中,并且浪费了大量时间来解决为什么它没有按预期工作。
  • 谢谢,您可以删除 ToString,因为 AppSettings 索引器已经返回字符串。
  • 我认为不需要显式调用 ToString。括号 is String 的返回类型已经是,不是吗?在我看来它像 "string".ToString() - 虽然在技术上是正确的,但有点多余。
【解决方案2】:
  var url = ConfigurationManager.AppSettings["ServiceProviderUrl"];

【讨论】:

  • 正确答案。 ToString() 虽然是多余的。
  • ToString 如果值不在应用程序配置中,则可能很危险。最好在解析之前捕获返回的对象并测试 null。当“mysettings”不在配置中时尝试运行它,你会看到异常弹出。相反,像下面这样的东西可能更安全... string key = "mysettings";字符串值 = ConfigurationManager.AppSettings[key]; if ( value == null ) value = "未知值";
  • true 不需要 .ToString() 因为它是一个字符串
  • @JoeHealy 您可以使用空合并运算符缩短它并提高清晰度:string value = ConfigurationManager.AppSettings[key] ?? "unknown value"
  • 我想知道这个答案和 OP 问题中的代码有什么区别!它们不一样吗?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    I found this solution to be quite helpful。它使用 C# 4.0 DynamicObject 来包装 ConfigurationManager。所以不要像这样访问值:

     WebConfigurationManager.AppSettings["PFUserName"]
    

    您将它们作为属性访问:

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

    编辑:添加代码 sn-p 以防链接失效:

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

    【讨论】:

      【解决方案5】:

      它的完整路径是

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

      【讨论】:

        【解决方案6】:

        会有两个 Web.config 文件。我想您可能对这两个文件感到困惑。

        检查这张图片:

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

        希望对你有帮助

        【讨论】:

          【解决方案7】:

          如果此项目正被另一个项目使用,则会出现此问题。确保将应用设置键复制到父项目的 app.config 或 web.config。

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

              在 .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"];
                  }
              }
              

              【讨论】:

                【解决方案10】:

                对不起,我没有测试过,但我认为它是这样完成的:

                var filemap = new System.Configuration.ExeConfigurationFileMap();            
                System.Configuration.Configuration config =  System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(filemap, System.Configuration.ConfigurationUserLevel.None);
                
                //usage: config.AppSettings["xxx"]
                

                【讨论】:

                  猜你喜欢
                  • 2013-01-09
                  • 2015-05-11
                  • 2013-09-13
                  • 1970-01-01
                  • 2016-10-26
                  • 2021-12-24
                  • 2016-01-07
                  • 1970-01-01
                  相关资源
                  最近更新 更多