【问题标题】:Is ConfigurationManager.AppSettings available in .NET Core 2.0?ConfigurationManager.AppSettings 在 .NET Core 2.0 中可用吗?
【发布时间】:2018-05-15 11:19:09
【问题描述】:

我有一个方法可以从我的配置文件中读取设置,如下所示:

var value = ConfigurationManager.AppSettings[key];

仅针对 .NET Standard 2.0 时编译良好。

现在我需要多个目标,所以我更新了我的项目文件:

<TargetFrameworks>netcoreapp2.0;net461;netstandard2.0</TargetFrameworks>

但现在,netcoreapp2.0 的编译失败并显示以下错误消息:

错误 CS0103 当前上下文中不存在名称“ConfigurationManager”(netcoreapp2.0)

另外,我创建了一个新的 .NET Core 2.0 控制台应用程序(这次只针对 .NET Core 2.0),但同样在命名空间 System.Configuration 下似乎没有 ConfigurationManager

我很困惑,因为它在 .NET Standard 2.0 下可用,所以我希望它在 .NET Core 2.0 中可用,因为 .NET Core 2.0 与 .NET Standard 2.0 兼容。

我错过了什么?

【问题讨论】:

  • 您可能缺少this。 (请注意,.NET Standard 目标涵盖 .NET 和 .NET Core,因此实际上也没有必要单独构建它们。)
  • 感谢@JeroenMostert,添加 NuGet 包 System.Configuration.ConfigurationManager 解决了问题。现在,这可能是一个单独的问题,但是如果需要添加包来填充缺失的位,.NET Core 2.0 如何被视为与 .NET Standard 2.0 兼容?
  • “.NET Standard 2.0 compliant”的意思是“如果你构建它以 .NET Standard 2.0 为目标,它将在 .NET Core 2.0(以及其他平台)上运行”。这并不意味着“如果您将其构建为面向 .NET Core 2.0,则所有 .NET Standard 2.0 API 都将可用而无需进一步操作”。如果你将它构建到 .NET Standard 2.0 并且它不能在 .NET Core 上运行,那么你有理由抱怨,但我认为这会奏效。 (不过,我还没有测试过。)
  • @AlexSanséau NuGet 包不是 poly-fills。在 .NET Core 上开始工作时,Microsoft 决定选择加入 API,这意味着您的应用程序占用空间更小。我建议花一些时间观看 Immo Landwerth 在 .NET Standard (youtube.com/…) 上创建的视频 - 他是 .NET Standard 团队的 PM
  • RE: It compiles fine when targeting .NET Standard 2.0 only - 这不可能是正确的,因为 ConfigurationManager 不是 .NET Standard 的一部分(到目前为止,直到 v.2.1 都是如此)。

标签: c# .net-core app-config .net-standard


【解决方案1】:

是的,在引用 NuGet 包 System.Configuration.ConfigurationManager 后,ConfigurationManager.AppSettings 在 .NET Core 2.0 中可用。

感谢@JeroenMostert 为我提供了解决方案。

【讨论】:

  • 你能从你的配置文件中发布代码吗?我试图弄清楚我在 .NET Core 2.0 中设置全局变量的方式/位置
  • @egmfrs,您介意重新措辞吗?全局变量将以类的静态属性的形式存在。配置文件包含应用程序设置是它们通常的格式:&lt;add key="YourSetting" value="YourValue" /&gt;
  • @AlexSanséau,我想弄清楚在哪里可以设置 AppSettings 的值。 web.config 或 appsettings.json 不起作用。你能举个例子在哪里设置 AppSettings 吗?谢谢。
  • @JanDeutschl,它应该进入 web.config 或 app.config 的 appSettings 部分,就像对传统 .NET 项目所做的那样。
  • 我有点困惑。这确实将 .NET Framework 4.6 列为依赖项。这是否意味着我的`.NET Core` 项目不再是纯粹的Core 项目?
【解决方案2】:

我将来自 Nuget 的 System.Configuration.ConfigurationManager 安装到我的 .net core 2.2 应用程序中。

然后我引用using System.Configuration;

接下来,我改了

WebConfigurationManager.AppSettings

to ..

ConfigurationManager.AppSettings

到目前为止,我认为这是正确的。 4.5.0 is typical with .net core 2.2

我对此没有任何问题。

【讨论】:

  • 迁移的简单修复之一。其他一些不是那么有趣:/
  • 您是否还创建了 web.config 文件?
  • 它不适用于我(.net core 3.1)。如果访问它没有任何设置数据
  • @Arteny - 我从来没有用 3.1 测试过 - 我安装了 3.1 并在家里玩过 - 但我目前的客户不想很快升级。
【解决方案3】:

设置好包后,您需要创建 app.config 或 web.config 并添加如下内容:

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

【讨论】:

    【解决方案4】:

    最新的一组指导如下:(来自https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variables

    用途:

    System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);

    来自文档:

    public static class EnvironmentVariablesExample
    {
        [FunctionName("GetEnvironmentVariables")]
        public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
            log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
            log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
        }
    
        public static string GetEnvironmentVariable(string name)
        {
            return name + ": " +
                System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
        }
    }
    

    在本地开发和在 Azure 中运行时,都可以从环境变量中读取应用设置。在本地开发时,应用设置来自 local.settings.json 文件中的 Values 集合。在本地和 Azure 这两种环境中,GetEnvironmentVariable("&lt;app setting name&gt;") 检索命名应用设置的值。例如,当您在本地运行时,如果您的 local.settings.json 文件包含{ "Values": { "WEBSITE_SITE_NAME": "My Site Name" } },则会返回“我的站点名称”。

    System.Configuration.ConfigurationManager.AppSettings 属性是获取应用设置值的替代 API,但我们建议您使用 GetEnvironmentVariable,如下所示。

    【讨论】:

    • 对于任何尝试此操作的人,您可以通过以下声明获得类似于 Microsoft 示例的语法:using static System.Environment;
    • 这种方法System.Environment.GetEnvironmentVariable 的一个亮点是您删除了System.Configuration.ConfigurationManager 的Nuget 包/依赖项
    【解决方案5】:

    您可以使用配置来解决此问题。

    Ex (Startup.cs):

    你可以在这个实现之后通过 DI 传递给控制器​​。

    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
    
            Configuration = builder.Build();
    
        }
    
        public IConfiguration Configuration { get; }
    
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
    
            var microserviceName = Configuration["microserviceName"];
    
           services.AddSingleton(Configuration);
    
           ...
        }
    

    【讨论】:

      【解决方案6】:

      我知道这有点太晚了,但也许有人正在寻找简单的方法来访问 .net 核心应用程序中的应用程序设置。 在 API 构造函数中添加以下内容:

      public class TargetClassController : ControllerBase
      {
          private readonly IConfiguration _config;
      
          public TargetClassController(IConfiguration config)
          {
              _config = config;
          }
      
          [HttpGet("{id:int}")]
          public async Task<ActionResult<DTOResponse>> Get(int id)
          {
              var config = _config["YourKeySection:key"];
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 2011-05-22
        • 2011-03-06
        • 2018-08-18
        • 1970-01-01
        • 2018-05-14
        相关资源
        最近更新 更多