Невозможно установить конфигурацию из файла настроек приложения JSON в проекте .NET Core.

Поскольку в .NET Core нет класса ConfigurationManager, теперь мне нужно установить конфигурацию в appsettings.json вместо web.config.

Согласно этому сообщению в блоге, я должен установить конфигурация там, поэтому я сделал так:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },

  "Conexion": {
    "name" : "empresas",
    "connectionString": "Data Source=empresas;Initial Catalog=CATALMA; Integrated Security=True;",
    "providerName": "System.Data.SqlClient"
  }
}

Я только что написал, что "Conexion".

Теперь я создал в папке ViewModels следующий класс:

public class ConexionConfig 
    {
       public string name { get; set; }
        public string connectionString { get; set; }
        public string providerName { get; set; }
    }

Теперь в Startup.cs в методе ConfigureServices я должен добавить его:

public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.Configure<ConexionConfig>(Configuration.GetSection("Conexion"));
            services.AddMvc();
        }

Но, к сожалению, я получаю следующую ошибку:

Argument 2: cannot convert from 
     'Microsoft.Extensions.Configuration.IConfigurationSection' to
     'System.Action<ConexionConfig>'

Что мне не хватает?


person Mr_LinDowsMac    schedule 21.07.2016    source источник
comment
Здравствуйте, вы когда-нибудь находили решение этой проблемы? У меня точно такая же проблема.   -  person AndyM    schedule 07.12.2016
comment
Да, но я изменил содержимое appsettings.json, чтобы оно соответствовало примеру, который я видел где-то еще.   -  person Mr_LinDowsMac    schedule 08.12.2016
comment
Смотрите опубликованный ответ   -  person Mr_LinDowsMac    schedule 08.12.2016


Ответы (3)


Во-первых, вам нужно добавить следующий пакет nuget в ваш основной проект ASP.

Microsoft.Extensions.Options.ConfigurationExtensions

Методы расширения, содержащиеся в пакете, позволят вам настроить строго типизированную конфигурацию так, как вы изначально хотели это сделать.

services.Configure<ConexionConfig>(Configuration.GetSection("Conexion"));

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

Microsoft.Extensions.Configuration.Binder

Это означает, что вам придется явно включить параметры конвейера и привязать действие. То есть:

services.AddOptions();
services.Configure<ConexionConfig>(x => Configuration.GetSection("Conexion").Bind(x));
person Sarel Esterhuizen    schedule 29.12.2016
comment
Этот ответ полезен. Просто обратите внимание, что с ASP.NET Core 2.0 дополнительный NuGet не требуется. - person Arghya C; 10.02.2018
comment
@ArghyaC - должно быть что-то изменилось в зависимостях библиотеки, потому что я обнаружил, что вам действительно нужен пакет NuGet. ASP.Net Core 2.1 - person Jeremy Thompson; 10.04.2019
comment
Это следует пометить как правильный ответ, потому что это сработало для меня. Я использую .NET Core 2.2. Использовал первый ответ, а не альтернативу. - person Gene S; 12.08.2019
comment
Столкнулся с этой проблемой после обновления .NET Core с 2.2 до 3.1. Это решило проблему для меня. - person smyk; 04.02.2020
comment
Я установил Install-Package Microsoft.Extensions.Options.ConfigurationExtensions -Version 3.1.2 и отлично работает - person Ciprian Jijie; 06.03.2020

Попробуйте установить пакет nuget Microsoft.Extensions.Configuration.Binder и использовать его метод Bind:

 services.Configure<ConexionConfig>(x => Configuration.GetSection("Conexion").Bind(x));

Вам также необходимо установить пакет параметров Microsoft.Extensions.Options и добавить его поддержку, если вы хотите внедрить свой класс параметров:

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();
    //..
}

Теперь вы можете внедрить IOptions<ConexionConfig> в свои контроллеры и представления.

person peco    schedule 22.07.2016
comment
Это сработает, вы правы, но если вы хотите настроить его так же, как многие учебники иллюстрируют проблему, вам нужно только добавить правильный пакет. Смотрите мой ответ... - person Sarel Esterhuizen; 29.12.2016

Я основывался на примере где-то еще. Изменил appsettings.json примерно так:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Data Source=myserver\\sql08;Initial Catalog=enterprises;User id=userAPP;Password=mypassword;"
    }
  }
}

Класс ConexionConfig изменился на это:

 public class ConexionConfig
        {

        public string ConnectionString { get; set; }

    }
}

Затем в Startup.cs

...
public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddMvc();
            services.Configure<ConexionConfig>(Configuration.GetSection("Data:DefaultConnection"));
        }
...

Важно включить using Microsoft.Extensions.Configuration в этот файл.

person Mr_LinDowsMac    schedule 08.12.2016
comment
Я думаю, что единственная разница между вашим первоначальным вопросом и этим ответом заключается в том, что вы добавили правильный пакет по пути. Смотрите мой ответ... - person Sarel Esterhuizen; 29.12.2016