11

我有一个针对 .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,其属性“始终复制”设置为True. config.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. 尝试提供一个非常基本的键值(平面)json配置,同时设置jsonMode为平面的默认值;

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

4

5 回答 5

10

如果你想像 .Net Core 一样使用 config 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"];
于 2019-07-11T20:09:15.893 回答
3

前段时间我也这样做了,但它不仅仅是一条线。您可以使用 Microsoft Nuget Packages Microsoft.Extensions.Configuration&Microsoft.Extensions.Configuration.Json并设置您自己的 ConfigurationBuilder。

看看这篇文章,我认为你应该通过它。

于 2018-12-04T08:23:02.890 回答
1
  • 我从您的问题中看到的主要内容是在您的 web.config 文件的“appSettings”元素中指定“configBuilders”属性:<appSettings configBuilders="SimpleJson">
  • 我认为您不必删除 jsonMode="Sectional" 属性。
  • 我认为您不必为 config.json 将“始终复制”设置为 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>
于 2019-07-06T23:58:04.213 回答
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"];
于 2019-03-14T10:20:26.033 回答
-1

我不确定默认设置现在如何工作,但我会告诉你我是如何在 .net 核心中加载我的配置文件的。

在 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 ://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.1

于 2018-12-04T09:28:51.143 回答