Приложение ASP.NET Core 2.1 не получает appsettings.Development.json, хотя я указываю ASPNETCORE_ENVIRONENT = Разработка в явном виде.Зачем? - PullRequest
0 голосов
/ 04 октября 2018

Итак, я работаю над ASP.NET Core 2.1 Web API.Я явно указал два набора конфигураций для «Разработка» и «Производство» с помощью следующих двух функций:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<DataContext>(option => option
        .UseMySql(Configuration.GetConnectionString("DefaultConnection"))                                              
}

public void ConfigureDevelopmentServices(IServiceCollection services)
{
    services.AddDbContext<DataContext>(option => option
        .UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
}

В appsettings.json у меня есть:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost; Database=datingApp; Uid=appuser; Pwd=zhanxucong"
    }
}

Вappsettings.Development.json, у меня есть:

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    },
    "ConnectionStrings": {
      "DefaultConnection": "Data Source=DatingApp.db"
    }
  }
}

Когда я изучал урок, инструктор сказал, что по соглашению, когда ASPNETCORE_ENVIRONMENT = Development установлен, ASP.NET Core будет вызывать более конкретную функцию конфигурации(т. е. ConfigureDevelopmentServices) и используйте более конкретный файл конфигурации appsettings (т. е. appsettings.Development.json).И я могу подтвердить, что он хорошо работал на моих Windows и Mac.Однако, когда я запускаю это приложение в Linux, после запуска ef-миграции с вышеуказанными настройками, я получаю следующие ошибки:

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 2.1.4-rtm-31024 initialized 'DataContext' using provider 'Microsoft.EntityFrameworkCore.Sqlite' with options: None
System.ArgumentException: Keyword not supported: 'server'.
   at Microsoft.Data.Sqlite.SqliteConnectionStringBuilder.GetIndex(String keyword)
   at Microsoft.Data.Sqlite.SqliteConnectionStringBuilder.set_Item(String keyword, Object value)
   at System.Data.Common.DbConnectionStringBuilder.set_ConnectionString(String value)
   at Microsoft.EntityFrameworkCore.Sqlite.Storage.Internal.SqliteRelationalConnection.CreateReadOnlyConnection()
   at Microsoft.EntityFrameworkCore.Sqlite.Storage.Internal.SqliteDatabaseCreator.Exists()
   at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_1.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Keyword not supported: 'server'.

Есть идеи, почему эта ошибка произойдет?Это связано с тем, что Linux чувствителен к регистру?Спасибо!

Обновление: мой класс Program и мой класс StartUp (ctor по умолчанию, предоставляемый инструментом dotnet-cli при запуске «dotnet new webapi»:

Класс программы:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

Класс запуска:

public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    // ConfigureServices, ConfigureDevelopmentServices, Configure methods.
}

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Спасибо за все предоставленные ответы.Я действительно ценю это, и я многому научился.

Что касается моей ошибки, то это на самом деле из-за очень глупой ошибки:

В моем файле appsettings.Development.json, "ConnectionStrings"вложен в "Logging".Поэтому, когда вызывается метод ConfigureDevelopmentServices, он не сможет найти ConnectionStrings в файле appsettings.Development.json и обратится к конфигурациям, указанным в appsettings.json, который настроен для подключения к базе данных MySQL.,Отсюда и ошибки, показанные в моей постановке проблемы.

Это наблюдение вдохновлено этой проблемой GitHub .

0 голосов
/ 04 октября 2018

Храните три вложенных файла, таких как appsettings.json, appsettings.Development.json и appsettings.Production.json.Тогда название среды от env.Укажите, какой файл использовать в файле Startup.cs и в среде bash set, используя

$ export ASPNETCORE_ENVIRONMENT=Development

. Возьмите соответствующий файл в зависимости от среды.Замените конструктор автозагрузки следующим.

public class Startup
{
    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();
    }

    public IConfiguration Configuration { get; }

    // code removed...
}

Пожалуйста, будьте последовательны при написании имен переменных среды.Имена переменных среды Linux чувствительны к регистру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...