Конфигурация GetSection возвращает нулевое значение для разделов объекта - PullRequest
0 голосов
/ 20 декабря 2018

Здравствуйте, я использую json файл конфигурации в .NET Core App, и я не понимаю, почему я получаю нулевое значение для подразделов, которые являются объектами:

{
    "tt": {
        "aa":3,
        "x":4
    },
    "Url":333,
    "Config": {
        "Production": {
            "RedisAddress": {
                "Hostname": "redis0",
                "Port": 6379
            },
            "OwnAddress": {
                "Hostname": "0.0.0.0",
                "Port": 9300
            }
        },
        "Dev": {
            "RedisAddress": {
                "Hostname": "redis0",
                "Port": 6379
            },
            "OwnAddress": {
                "Hostname": "0.0.0.0",
                "Port": 9300
            },
            "Logger": "logger.txt"
        }
    }
}

Когда я пытаюсь GetSection("Config")или GetSection("tt") я получаю значение null. Однако он возвращает значение для примитивных типов, как в моем случае Url.

Что забавно, если я загляну внутрь configuration.Providers[0].Data, у меня есть всесодержимое присутствует как на картинке:

enter image description here

Почему он возвращает ноль для object типов?

Код

WebHostBuilder builder = new WebHostBuilder();
builder.UseStartup<Startup>();

string appPath = AppDomain.CurrentDomain.BaseDirectory;
string jsonPath = Path.Combine(Directory.GetParent(Directory.GetParent(appPath).FullName).FullName, "appsettings.json");

IConfiguration configuration = new ConfigurationBuilder()
    .SetBasePath(appPath)
    .AddJsonFile(jsonPath, optional: true, reloadOnChange: true)
    .Build();

var sect = configuration.GetSection("Config");//has value null
var sect2 = configuration.GetSection("tt");//has value null
var sect3 = configuration.GetSection("Url"); has value 333

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

var sect = configuration.GetSection("Config"); возвращает значение NULL, поскольку в разделе Config нет ключа и значения, вместо этого в нем содержится SubSection, равное Production.Key и Value находятся на самом низком уровне этой иерархии.

Здесь - это сведения от Microsoft о прочтении файла appsettings.json в ASP.NET Core.

В соответствии с приведенной выше документацией вам нужно сделать следующее, чтобы прочитать значения из файла appsettings.json:

var hostName = configuration.GetSection("Config:Production:RedisAddress:Hostname").Value; // will return the value "redis0" for key `HostName`
var port = configuration.GetSection("Config:Production:RedisAddress:Port").Value; // will return the value 6379 for key `Port`
var aa = configuration.GetSection("tt:aa").Value; // will return 3

Следуя приведенной выше методологии, вы можете прочитать любое значение из файла appsettings.json:

0 голосов
/ 20 декабря 2018

Оба ответа ( TanvirArjel и Кирк Ларкин ) верны.Я просто собираюсь объяснить вам кое-что и предоставить другой способ получения значения из файла конфигурации.

Чтобы получить значение из appsettings.json, вам нужно указать путь к значению (colon-separated)configuration.

Существуют различные способы получения значения без привязки раздела к классу.Например:

var aaAsString = configuration["tt:aa"]; //will return the value as a string "3".
//To get the actual value type you need to cast them 
var aa1 = configuration.GetValue<int>("tt:aa"); //returns 3.
var aa2 = configuration.GetSection("tt").GetValue<int>("aa");
var aa3 = configuration.GetSection("tt").GetValue(typeof(int), "aa");
0 голосов
/ 20 декабря 2018

В вашем примере нет ничего плохого.Свойство Value, на которое вы ссылаетесь, это string, что равно null для ваших переменных sect и sect2 просто потому, что ни одно из них не содержит значения string - они оба являются объектами, так какВы указали.

Если вы хотите извлечь значение из, например, sect2, вы можете сделать это, используя что-то вроде этого:

var aaValue = sect2.GetValue<int>("aa");

Есть еще несколько вариантов дляполучить значения для раздела, как это.Вот еще один пример, который будет привязан к POCO:

public class TT
{
    public int AA { get; set; }
    public int X { get; set; }
}

var ttSection = sect2.Get<TT>();

Если все, что вы хотите сделать, это получить вложенное значение, то на самом деле нет никакой причины использовать GetSection вообще.Например, вы можете просто сделать следующее:

var redisHostname = configuration["Config:Dev:RedisAddress:Hostname"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...