完整的.NET Framework控制台应用程序中的JSON配置

15

我有一个针对.NET 4.7.1的控制台应用。我正在尝试在我的.Net Framework应用程序中使用类似于.net core的配置。我的`App.config如下:


<configuration>
  <configSections>
    <section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false" />
  </configSections>
  <configBuilders>
    <builders>
    <add name="SimpleJson"
         jsonFile="config.json"
         optional="false"
         jsonMode="Sectional"
         type="Microsoft.Configuration.ConfigurationBuilders.SimpleJsonConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Json, Version=1.0.0.0, Culture=neutral" /></builders>
  </configBuilders>

我有一个名为config.json的文件,它的属性"Copy Always"设置为Trueconfig.json的内容如下:

  {
  "appSettings": {
    "setting1": "value1",
    "setting2": "value2",
    "complex": {
      "setting1": "complex:value1",
      "setting2": "complex:value2"
    }
  },

  "connectionStrings": {
    "mySpecialConnectionString": "Dont_check_connection_information_into_source_control"
  }
}

然后,在我的main方法中,我尝试读取配置值,如下所示:

var config = ConfigurationManager.AppSettings

然而,config 的值始终为 null。我尝试了以下操作:

  1. jsonFile 更改为 ~/config.json
  2. 在将 jsonMode 设置为默认的 flat 值的同时,提供了一个非常基本的 key-value(flat)JSON 配置;

但是,无法让配置正常工作。如何解决这���问题?

5个回答

15
如果你想在 .Net Core 中使用配置json文件,您可以安装NuGet包 Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.Json 并初始化配置。
IConfigurationRoot configuration = new ConfigurationBuilder()
.AddJsonFile("config.json", optional: true)
.Build();

完成后,您可以像在 .Net Core 中一样使用配置。例如:

{
  "myConfig": {
    "item1": "config options"
  }
}

对于这个JSON,您将调用:

var configItem = configuration["myConfig:item1"];

4
但是这两个NuGet包依赖于.NET Core 3.1,它们能用于.NET Framework 4.6应用程序吗? - user1066231
2
对于Net Framework,您必须使用版本1.1.2,因为更新的版本不支持Net Framework:https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Json/1.1.2 - Roland Pihlakas
4
由于您需要使用Microsoft扩展的弃用版本,这可能意味着该方法在Microsoft的.NET Framework中不再得到完全支持。由于提问者明确要求一个.NET Framework解决方案,所以我对这个答案进行了反对投票。 - Jim K
1
我知道你正在尝试摆脱app.config配置,而且你有充分的理由这样做,但我认为@JimK是正确的:对于.NET Framework项目,推荐的方式仍然是通过设置(app.config)来实现,就像你以前做的那样。在使用设置设计器配置项目设置后,它会自动生成一个类型安全的类。这很容易处理,更重要的是,它是类型安全的;而appsettings.json默认情况下不是,也就是说,你需要自己解析它。 - Lucky Brain
你可以使用这些包的7版本与4.6.2+框架一起使用。所以这种方法现在在.NET Framework中得到了完全支持。 - Giorgos Betsos

3

我之前也做过类似的事情,但这不仅仅是一个一行代码。你可以使用微软Nuget包 Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.Json 并设置自己的ConfigurationBuilder。

看看这篇文章,我认为你应该能够理解。


1
我认为整个想法是使用MicrosoftConfigurationBuilders中的SimpleJsonConfigBuilder,但似乎这不是“开箱即用”的。该项目尚未针对此情况进行测试。有SimpleJson_GetValue()和SimpleJson_GetAllValues(),但两者都为空。 - Belurd
2
对于Net Framework,您必须使用1.1.2版本,因为新版本不支持Net Framework:https://www.nuget.org/packages/Microsoft.Extensions.Configuration.Json/1.1.2 - Roland Pihlakas

1
  • 我在你的问题中看到的主要遗漏是没有在web.config文件的"appSettings"元素中指定"configBuilders"属性:<appSettings configBuilders="SimpleJson">
  • 我认为你不必删除jsonMode="Sectional"属性。
  • 我认为你不必将config.json的"Copy Always"配置为True。

这是对我有效的代码:

<configBuilders>
    <builders>
    <add name="SimpleJson" jsonFile="~\developer_config.json" optional="false" jsonMode="Sectional" type="Microsoft.Configuration.ConfigurationBuilders.SimpleJsonConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Json, Version=1.0.0.0, Culture=neutral" />
    </builders>
</configBuilders>
<appSettings configBuilders="SimpleJson">
...
</appSettings>

0

看一下源代码中的示例。

你应该在你的配置文件部分中添加。

<appSettings configBuilders="SimpleJson">
<add key="AppConfiguration:Key1" value="will be replaced by value in json file" />
</appSettings>

并删除 jsonMode="Sectional" 属性。

您可以使用以下方式访问您的值

var key1 = ConfigurationManager.AppSettings["AppConfiguration:Key1"];

-2

我不确定默认设置现在是如何工作的,但我会向您展示如何在 .net core 中加载我的配置文件。

在 CreateDefaultBuilder 之后,在 UseStartup 之前添加 ConfigureAppConfiguration 方法,像这样:

 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    //HostingEnvironment = hostingContext.HostingEnvironment;

                    //config.SetBasePath(HostingEnvironment.ContentRootPath);
                    var workingDirectory = AppContext.BaseDirectory; // HostingEnvironment.ContentRootPath // Directory.GetCurrentDirectory()
                    foreach (var file in Directory.GetFiles(workingDirectory, "*_config.json"))
                    {
                        config.AddJsonFile(file);//);Path.GetFileName(file));
                    }
                })
                .UseStartup<Startup>();

在您的情况下,如果您的配置未加载:

config.AddJsonFile(Path.Combine(workingDirectory, "config.json"));

这将.config文件添加到应用程序中。 在ConfigureServices方法中,我们可以通过部分访问这些配置,并使用这些值填充一些类属性。

services.Configure<CommonAppSettings>(this.Configuration.GetSection("appSettings"));

直接访问:

var value1 = this.Configuration.GetSection("appSettings").GetValue(typeof(string), "setting1", "defaultValueIfNotFound");

连接字符串:

//I'm not sure about "ConnectionStrings" section case sensitivity.
var connectionString = this.Configuration.GetConnectionString("mySpecialConnectionString");

有用的链接: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接