【问题标题】:Reading settings from app.config or web.config in .NET从 .NET 中的 app.config 或 web.config 读取设置
【发布时间】:2020-06-01 05:47:08
【问题描述】:

我正在开发一个 C# 类库,它需要能够从 web.configapp.config 文件中读取设置(取决于 DLL 是从 ASP.NET Web 应用程序还是 Windows 窗体应用程序引用的) )。

我发现了

ConfigurationSettings.AppSettings.Get("MySetting")

有效,但该代码已被 Microsoft 标记为已弃用。

我已经读到我应该使用:

ConfigurationManager.AppSettings["MySetting"]

但是,System.Configuration.ConfigurationManager 类似乎无法从 C# 类库项目中获得。

最好的方法是什么?

【问题讨论】:

标签: c# .net configuration appsettings


【解决方案1】:

额外:如果您正在处理类库项目,则必须嵌入 settings.json 文件。

类库不应该直接引用 app.config - 该类没有 app.config,因为它不是 应用程序,它是一个类。

  1. 转到 JSON 文件的属性。
  2. 更改构建操作 -> 嵌入式资源。
  3. 使用以下代码阅读。

var assembly = Assembly.GetExecutingAssembly();

var resourceStream = assembly.GetManifestResourceStream("Assembly.file.json");

string myString = reader.ReadToEnd();

现在我们有了一个 JSON 字符串,我们可以使用 JsonConvert 对其进行反序列化

如果你没有在程序集中嵌入文件,你不能只使用没有文件的 DLL 文件

【讨论】:

    【解决方案2】:

    如果您需要/想要使用 ConfigurationManager 类...

    您可能需要由 Microsoft 通过 NuGet 包管理器

    加载 System.Configuration.ConfigurationManager

    工具->NuGet 包管理器->管理用于解决方案的 NuGet 包...

    Microsoft Docs

    文档中值得注意的一点...

    如果您的应用程序需要对其自己的配置进行只读访问, 我们建议您使用 GetSection(String) 方法。这种方法 提供对当前缓存配置值的访问 应用程序,它具有比配置更好的性能 类。

    【讨论】:

      【解决方案3】:

      我能够将以下方法用于 .NET Core 项目:

      步骤:

      1. 在您的项目中创建一个 appsettings.json(格式如下)。
      2. 接下来创建一个配置类。格式如下。
      3. 我创建了一个 Login() 方法来显示配置类的用法。

        在你的项目中创建 appsettings.json 内容:

        {
          "Environments": {
            "QA": {
              "Url": "somevalue",
         "Username": "someuser",
              "Password": "somepwd"
          },
          "BrowserConfig": {
            "Browser": "Chrome",
            "Headless": "true"
          },
          "EnvironmentSelected": {
            "Environment": "QA"
          }
        }
        
        public static class Configuration
        {
            private static IConfiguration _configuration;
        
            static Configuration()
            {
                var builder = new ConfigurationBuilder()
                    .AddJsonFile($"appsettings.json");
        
                _configuration = builder.Build();
        
            }
            public static Browser GetBrowser()
            {
        
                if (_configuration.GetSection("BrowserConfig:Browser").Value == "Firefox")
                {
                    return Browser.Firefox;
                }
                if (_configuration.GetSection("BrowserConfig:Browser").Value == "Edge")
                {
                    return Browser.Edge;
                }
                if (_configuration.GetSection("BrowserConfig:Browser").Value == "IE")
                {
                    return Browser.InternetExplorer;
                }
                return Browser.Chrome;
            }
        
            public static bool IsHeadless()
            {
                return _configuration.GetSection("BrowserConfig:Headless").Value == "true";
            }
        
            public static string GetEnvironment()
            {
                return _configuration.GetSection("EnvironmentSelected")["Environment"];
            }
            public static IConfigurationSection EnvironmentInfo()
            {
                var env = GetEnvironment();
                return _configuration.GetSection($@"Environments:{env}");
            }
        
        }
        
        
        public void Login()
        {
            var environment = Configuration.EnvironmentInfo();
            Email.SendKeys(environment["username"]);
            Password.SendKeys(environment["password"]);
            WaitForElementToBeClickableAndClick(_driver, SignIn);
        }
        

      【讨论】:

        【解决方案4】:

        ConfigurationManager 不是您访问自己的设置所需要的。

        为此,您应该使用

        {YourAppName}.Properties.Settings.{settingName}

        【讨论】:

          【解决方案5】:

          您可以使用以下行。就我而言,它正在工作: System.Configuration.ConfigurationSettings.AppSettings["yourKeyName"]

          您必须注意上述代码行也是旧版本,并且在新库中已弃用。

          【讨论】:

            【解决方案6】:

            第 1 步:右键单击引用选项卡以添加引用。

            第 2 步:单击“程序集”选项卡

            第 3 步:搜索“System.Configuration”

            第 4 步:点击确定。

            然后就可以了。

             string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];
            

            【讨论】:

              【解决方案7】:

              .NET Framework 4.5 和 4.6 的更新;以下将不再起作用:

              string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];
              

              现在通过属性访问设置类:

              string keyvalue = Properties.Settings.Default.keyname;
              

              更多信息请参见Managing Application Settings

              【讨论】:

              • 属性自2010.
              • 非常感谢您发布此信息。我确定 Properties.Settings.Default.MachName 有效,但我无法弄清楚为什么 ConfigurationManager.AppSettings["MachName"] 返回 null。
              • 这结束了我长期的痛苦。谢谢。该框架应该警告您旧方法已过时。
              • 无法确认。 ConfigurationManager.AppSettings["someKey"] 适用于 .NET 4.5、4.6、4.7.1
              • @Ivanhoe 您使用的是什么版本的 VisualStudio? ConfigurationManager.AppSettings["someKey"] 与 4.6.1 和 VS 15.8.2 一起工作,但对我来说在 4.6.1 和 VS 15.9.2 上失败了。
              【解决方案8】:

              请检查您正在使用的 .NET 版本。它应该高于 4。并且您必须将 System.Configuration 系统库添加到您的应用程序中。

              【讨论】:

              • 这个问题是 9 年前提出的,已经有 20 多个答案,其中 2 个每个都有超过 600 个赞成票,接受的答案是添加对 System.Configuration 的引用。这个额外的答案不会增加价值。充其量,这应该是对已接受答案的评论。
              • Re"高于 4":在主版本号中?还是您的意思是“高于4.0”?或者换句话说,.NET Framework 4.5 会站在哪一​​边?
              【解决方案9】:

              这是一个例子:App.config

              <applicationSettings>
                  <MyApp.My.MySettings>
                      <setting name="Printer" serializeAs="String">
                          <value>1234 </value>
                      </setting>
                  </MyApp.My.MySettings>
              </applicationSettings>
              
              Dim strPrinterName as string = My.settings.Printer
              

              【讨论】:

                【解决方案10】:

                我找到了以系统方式访问应用程序设置变量的最佳方法,方法是在 System.Configuration 上创建一个包装类,如下所示

                public class BaseConfiguration
                {
                    protected static object GetAppSetting(Type expectedType, string key)
                    {
                        string value = ConfigurationManager.AppSettings.Get(key);
                        try
                        {
                            if (expectedType == typeof(int))
                                return int.Parse(value);
                            if (expectedType == typeof(string))
                                return value;
                
                            throw new Exception("Type not supported.");
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(string.Format("Config key:{0} was expected to be of type {1} but was not.",
                                key, expectedType), ex);
                        }
                    }
                }
                

                现在我们可以使用下面的另一个类通过硬编码名称访问所需的设置变量:

                public class ConfigurationSettings:BaseConfiguration
                {
                    #region App setting
                
                    public static string ApplicationName
                    {
                        get { return (string)GetAppSetting(typeof(string), "ApplicationName"); }
                    }
                
                    public static string MailBccAddress
                    {
                        get { return (string)GetAppSetting(typeof(string), "MailBccAddress"); }
                    }
                
                    public static string DefaultConnection
                    {
                        get { return (string)GetAppSetting(typeof(string), "DefaultConnection"); }
                    }
                
                    #endregion App setting
                
                    #region global setting
                
                
                    #endregion global setting
                }
                

                【讨论】:

                • 这使用了OP指出的方法被标记为已弃用。
                【解决方案11】:

                从配置中读取:

                您需要添加对配置的引用:

                1. 在您的项目中打开“属性”
                2. 转到“设置”选项卡
                3. 添加“名称”和“值”
                4. 使用以下代码获取价值:

                  string value = Properties.Settings.Default.keyname;
                  

                保存到配置:

                   Properties.Settings.Default.keyName = value;
                   Properties.Settings.Default.Save();
                

                【讨论】:

                • 仅供参考:Google 最喜欢您的回答。当您搜索“get app config settings c#”时逐字显示
                【解决方案12】:

                为了完整起见,还有一个仅适用于 Web 项目的选项: System.Web.Configuration.WebConfigurationManager.AppSettings["MySetting"]

                这样做的好处是不需要添加额外的引用,因此对某些人来说可能更可取。

                【讨论】:

                  【解决方案13】:

                  我总是使用为所有配置值声明的类型安全属性创建一个 IConfig 接口。 Config 实现类然后包装对 System.Configuration 的调用。您的所有 System.Configuration 调用现在都在一个地方,维护和跟踪正在使用的字段并声明它们的默认值变得更加容易和清晰。我编写了一组私有辅助方法来读取和解析常见的数据类型。

                  使用IoC 框架,您只需将接口传递给类构造函数,即可在应用程序中的任何位置访问IConfig 字段。然后,您还可以在单​​元测试中创建 IConfig 接口的模拟实现,因此您现在可以测试各种配置值和值组合,而无需修改 App.config 或 Web.config 文件。

                  【讨论】:

                    【解决方案14】:

                    另外,你可以使用Formo:

                    配置:

                    <appSettings>
                        <add key="RetryAttempts" value="5" />
                        <add key="ApplicationBuildDate" value="11/4/1999 6:23 AM" />
                    </appSettings>
                    

                    代码:

                    dynamic config = new Configuration();
                    var retryAttempts1 = config.RetryAttempts;                 // Returns 5 as a string
                    var retryAttempts2 = config.RetryAttempts(10);             // Returns 5 if found in config, else 10
                    var retryAttempts3 = config.RetryAttempts(userInput, 10);  // Returns 5 if it exists in config, else userInput if not null, else 10
                    var appBuildDate = config.ApplicationBuildDate<DateTime>();
                    

                    【讨论】:

                    • 你到底为什么要这样做?
                    • 9 年后它变得更加无关紧要。哎呀
                    【解决方案15】:

                    试试这个:

                    string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];
                    

                    web.config 文件中,这应该是下一个结构:

                    <configuration>
                    <appSettings>
                    <add key="keyname" value="keyvalue" />
                    </appSettings>
                    </configuration>
                    

                    【讨论】:

                      【解决方案16】:

                      我遇到了同样的问题。只需以这种方式阅读它们: System.Configuration.ConfigurationSettings.AppSettings["MySetting"]

                      【讨论】:

                      • 根据微软关于 ConfigurationSettings.AppSettings This method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
                      • 此方法已过时
                      【解决方案17】:

                      您可能正在将 App.config 文件添加到 DLL 文件中。 App.Config 仅适用于可执行项目,因为所有 DLL 文件都从正在执行的 EXE 文件的配置文件中获取配置。

                      假设您的解决方案中有两个项目:

                      • SomeDll
                      • 一些Exe

                      您的问题可能与您将 app.config 文件包含到 SomeDLL 而不是 SomeExe 的事实有关。 SomeDll 能够从 SomeExe 项目中读取配置。

                      【讨论】:

                      • 哇,这并不明显。如果有人可以链接一个谈论这个的文件,那就太棒了。这是一个很难搜索的主题。
                      • 谢谢。在任何地方都没有看到这一点。
                      【解决方案18】:

                      几天来,我一直在尝试解决同样的问题。我能够通过在 web.config 文件的 appsettings 标记中添加一个键来解决此问题。这应该在使用帮助程序时覆盖 .dll 文件。

                      <configuration>
                          <appSettings>
                              <add key="loginUrl" value="~/RedirectValue.cshtml" />
                              <add key="autoFormsAuthentication" value="false"/>
                          </appSettings>
                      </configuration>
                      

                      【讨论】:

                        【解决方案19】:

                        我强烈建议您为此调用创建一个包装器。类似于ConfigurationReaderService 并使用dependency injection 来获取此类。这样您就可以隔离此配置文件以进行测试。

                        所以使用建议的ConfigurationManager.AppSettings["something"]; 并返回此值。如果 .config 文件中没有任何可用的键,则使用此方法可以创建某种默认返回。

                        【讨论】:

                        • Microsoft 已经有一种内置方式来管理同一配置文件的多个版本:build configurations,它允许为每个构建配置使用单独的配置文件:app.DEBUG.configapp.RELEASE.configapp.TEST.config
                        【解决方案20】:

                        对于如下示例 app.config 文件:

                        <?xml version="1.0" encoding="utf-8" ?>
                        <configuration>
                          <appSettings>
                            <add key="countoffiles" value="7" />
                            <add key="logfilelocation" value="abc.txt" />
                          </appSettings>
                        </configuration>
                        

                        您使用下面显示的代码阅读了上述应用程序设置:

                        using System.Configuration;
                        

                        您可能还需要在您的项目中添加对System.Configuration 的引用(如果还没有的话)。然后您可以像这样访问这些值:

                        string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
                        string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];
                        

                        【讨论】:

                        • 我更喜欢你的答案,而不是接受的答案。带有示例的答案总是对我有用。
                        • 这对我有用。但是,我的 System.Configuration 不包含 ConfigurationManager,因此我必须使用 ConfigurationSettings。具有讽刺意味的是,我仍然收到它已过时的警告。
                        • 这也发生在我身上。您是否尝试过添加 System.Configuration 参考?问题是 VS 通过让你认为你真的拥有它来愚弄你。您可以使用智能感知来获取命名空间 System.Configuration 但它没有 ConfigurationManager 类。只需添加引用即可修复它。
                        • @Cricketheads System.Configuration 确实包含 ConfigurationManager,您可能在项目中缺少对 System.Configuration 的引用。
                        • 有人能告诉我为什么他们认为 System.Configuration 没有默认添加...这在大多数应用程序中似乎是一个非常基本的需求。
                        【解决方案21】:

                        web.config 用于 Web 应用程序。 web.config 默认情况下有几个 Web 应用程序所需的配置。您的 Web 应用程序下的每个文件夹都可以有一个 web.config

                        app.config 用于 Windows 应用程序。当您在 Visual Studio 中构建应用程序时,它会自动重命名为 &lt;appname&gt;.exe.config,并且此文件必须与您的应用程序一起交付。

                        您可以使用相同的方法从两个配置文件中调用app settings 值: System.Configuration.ConfigurationSettings.AppSettings["Key"]

                        【讨论】:

                        • 也可以用System.Configuration.COnfigurationSettings.AppSettings.Get("Key")代替方括号。
                        【解决方案22】:

                        右键单击您的类库,然后从菜单中选择“添加引用”选项。

                        然后从 .NET 选项卡中选择 System.Configuration。这会将 System.Configuration DLL 文件包含到您的项目中。

                        【讨论】:

                        • 添加参考后,可以做到ConfigurationManager.ConnectionStrings[0].ConnectionString
                        【解决方案23】:

                        您必须向项目添加对 System.Configuration 程序集的引用。

                        【讨论】:

                          【解决方案24】:

                          我正在使用它,它对我很有效:

                          textBox1.Text = ConfigurationManager.AppSettings["Name"];
                          

                          【讨论】:

                          • TS 明确指出,他使用相同的代码,但他的项目无法编译(事实证明,由于缺少引用)。 -1 表示不阅读问题。
                          【解决方案25】:

                          另一种可能的解决方案:

                          var MyReader = new System.Configuration.AppSettingsReader();
                          string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();
                          

                          【讨论】:

                            【解决方案26】:

                            您需要在项目的references 文件夹添加对System.Configuration 的引用

                            您绝对应该使用 ConfigurationManager 而不是过时的 ConfigurationSettings

                            【讨论】:

                            • 非常感谢!非常直接的答案。我正在构建一个控制台应用程序!这个答案拯救了一天!
                            • 这对于 .net core 是否仍然准确。
                            • @Triynko 您应该指定您想要确认的 .NET Core 版本以确认兼容性,因为在撰写本文时……您正在查看 .NET Core 3.1、.NET 5 或6.另外,那些阅读.. 对于注释,C# 9 和 VS2019 - Program.cs 不需要引用 System.Configuration(不必要)。
                            猜你喜欢
                            • 2011-05-12
                            • 2010-10-15
                            • 2014-01-19
                            • 2013-01-09
                            • 2018-03-10
                            • 1970-01-01
                            相关资源
                            最近更新 更多