代码之家  ›  专栏  ›  技术社区  ›  kovac

完整的JSON配置。NET框架控制台应用程序

  •  1
  • kovac  · 技术社区  · 7 年前

    我有一个控制台应用程序。NET 4.7.1。我想用。在我的系统中,类似net core的配置。Net框架应用程序。我的应用程序。配置为:

    <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 . 配置。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 设置为单位的默认值;

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

    2 回复  |  直到 5 年前
        1
  •  12
  •   Chad Hedgcock    6 年前

    如果要使用中的配置json文件。Net内核,您可以安装NuGet软件包 Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.Json 然后初始化配置

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

    之后,您可以使用中的配置。净核心。例如:

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

    对于此json,您将调用:

    var configItem = configuration["myConfig:item1"];
    
        2
  •  1
  •   Paul Schroeder    6 年前
    • 我看到您的问题中忽略的主要内容是在web中指定“configBuilders”属性。配置文件的“appSettings”元素: <appSettings configBuilders="SimpleJson">
    • 我认为不必删除jsonMode=“Sectional”属性。
    • 我认为您不必将“始终复制”设置为True 配置。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>
    
        3
  •  3
  •   Waescher    7 年前

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

    看看 this article ,我认为你应该完成它。

        4
  •  -1
  •   Obelixx    7 年前

    我不确定默认设置现在是如何工作的,但我将向您展示我是如何加载配置文件的。净核心。

    在CreateDefaultBuilder之后和使用Startup之前添加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"));
    

    这就补充了一点。应用程序的配置文件。 在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

        5
  •  0
  •   user2686610    7 年前

    请看下面的例子 source code

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

    <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"];