.NET Core 2.0中是否提供ConfigurationManager.AppSettings?


142

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

var value = ConfigurationManager.AppSettings[key];

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

现在我需要多个目标,因此我使用以下命令更新了项目文件:

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

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

Error   CS0103  The name 'ConfigurationManager' does not exist in the current context   (netcoreapp2.0)

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

我很困惑,因为它在.NET Standard 2.0下可用,因此我希望它在.NET Core 2.0中可用,因为.NET Core 2.0符合.NET Standard 2.0。

我想念什么?


10
您可能会错过这个。(请注意,一个.NET标准目标涵盖两个 .NET和.NET的核心,所以真的没有必要建立这些单独为好。)
的Jeroen Mostert

感谢@JeroenMostert,添加NuGet包System.Configuration.ConfigurationManager解决了该问题。现在,这可能是一个单独的问题,但是如果需要添加软件包以填充丢失的位,.NET Core 2.0如何被视为.NET Standard 2.0兼容?
亚历克斯·桑索(AlexSanséau),

2
“ .NET Standard 2.0兼容”表示“如果将其构建为目标.NET Standard 2.0,它将在.NET Core 2.0(以及其他平台)上运行”。这并不意味着“如果针对.NET Core 2.0进行构建,则所有.NET Standard 2.0 API都将可用,而无需采取进一步措施”。如果将其构建为.NET Standard 2.0,并且无法在.NET Core上运行,可能会引起投诉,但我认为这将起作用。(不过,我尚未对其进行测试。)
Jeroen Mostert

4
@AlexSanséauNuGet包不是多边形填充。在.NET Core上开始工作时,Microsoft决定选择加入API,这意味着您的应用程序占用的空间较小。我建议您花些时间观看Immo Landwerth在.NET Standard(youtube.com/…)上创建的视频-他是.NET Standard团队的项目经理
Jamie Taylor

1
RE:It compiles fine when targeting .NET Standard 2.0 only-这ConfigurationManager是不正确的,因为它不是.NET Standard的一部分(到目前为止,直到v.2.1为止都是如此)。
G. Stoynev

Answers:


268

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

感谢@JeroenMostert给我解决方案。


1
您可以从配置文件中发布代码吗?我想弄清楚如何/在.NET Core 2.0中设置全局变量的方式
egmfrs 18-4-27

1
@egmfrs,您介意重新表达一下吗?全局变量将以类的静态属性的形式存在。包含应用程序设置的配置文件是其通常的格式:<add key="YourSetting" value="YourValue" />
AlexSanséau,

2
@AlexSanséau,我试图找出在哪里可以设置AppSettings的值。web.config或appsettings.json不起作用。您能否举一个在哪里设置AppSettings的示例?谢谢。
Jan Deutschl '18

2
@JanDeutschl,它应该进入web.config或app.config的appSettings部分,就像处理传统的.NET项目一样。
亚历克斯·桑索(AlexSanséau),

8
我有点困惑。这确实.NET Framework 4.6列为依赖项。这是否意味着我的.NET Core项目不再是纯Core项目?
James Poulose

20

System.Configuration.ConfigurationManager从Nuget 安装到.net core 2.2应用程序中。

然后我参考 using System.Configuration;

接下来,我改变了

WebConfigurationManager.AppSettings

to ..

ConfigurationManager.AppSettings

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

我对此没有任何问题。


迁移的简单修补程序之一。其他一些不是那么有趣:/
汤姆·斯蒂克

您还创建了一个web.config文件吗?
swedish_junior_dev

2
它对我不起作用(.net core 3.1)。如果有访问,它没有任何设置数据
arteny

@Arteny-我从未在3.1上进行过测试-我安装了3.1并在家里玩过-但是我当前的客户端不希望很快升级。
Tom Stickel

8

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

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

7

最新的指南集如下:(来自https://docs.microsoft.com/zh-cn/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这两种环境中,都检索命名应用程序设置的值。例如,当您在本地运行时,如果local.settings.json文件包含,则将返回“我的网站名称” 。GetEnvironmentVariable("<app setting name>"){ "Values": { "WEBSITE_SITE_NAME": "My Site Name" } }

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


对于任何尝试此操作的人,都可以通过声明以下内容来获得类似于Microsoft示例的语法:using static System.Environment;
MattMakes

1

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

例如(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);

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