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



我有一个针对.NET 4.7.1的控制台应用程序。我正在尝试在我的.net Framework应用程序中使用类似.net核心的配置。我的`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的值始终为空。我尝试了以下方法:

  1. 尝试将jsonFile更改为~/config.json
  2. 尝试给出一个非常基本的键值(flat(json-config,同时将jsonMode设置为flat的默认值

但是,无法使配置正常工作。如何解决此问题?

如果您想像在.Net Core中那样使用配置json文件,可以安装NuGet包Microsoft.Extension.Configuration和Microsoft.Extension.Cnfiguration.json然后初始化配置

IConfigurationRoot configuration = new ConfigurationBuilder()
.AddJsonFile("config.json", optional: true)
.Build();

之后,您可以使用.Net Core中的配置。例如:

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

对于这个json,您将调用:

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

我不久前也这样做了,但这不仅仅是一句话。您可以使用Microsoft Nuget软件包Microsoft.Extensions.Configuration&Microsoft.Extensions.Configuration.Json并设置您自己的ConfigurationBuilder。

看看这篇文章,我认为你应该把它读完

  • 我在您的问题中忽略的主要内容是在web.config文件的"appSettings"元素中指定"configBuilders"属性:<appSettings configBuilders="SimpleJson">
  • 我认为您不必删除jsonMode="Section"属性
  • 我认为您不必将的"始终复制"设置为Trueconfig.json

这是适用于我的代码:

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

查看源代码中的示例

您应该在配置文件中添加部分

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

并删除jsonMode="Section"属性。

您可以使用访问您的价值

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

我不确定默认值现在是如何工作的,但我将向您展示我是如何在.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

最新更新