Значение EFCore не может быть нулевым. (Параметр 'connectionString'), если значение находится в переменных окружения

В веб-приложении Asp.NET Core с EFCore-5 у меня есть следующие ConfigureServices

// ...
services.AddRouting(options => options.LowercaseUrls = true);

// get the connection string from secrets/env.variables
string connectionString = Configuration.GetConnectionString("MyWebApp"); /// <<< HERE
services.AddDbContext(connectionString);

services.AddDatabaseDeveloperPageExceptionFilter();    
services.AddControllersWithViews();
// ...

а также AddDbContext метод расширения:

public static void AddDbContext(this IServiceCollection services, string connectionString) =>
        services.AddDbContext<ApplicationDbContext>(options =>
        {
            options.UseSqlServer(connectionString,    /// <<< HERE
                providerOptions =>
                {
                    providerOptions
                        .EnableRetryOnFailure(
                            maxRetryCount: 5, 
                            maxRetryDelay: TimeSpan.FromSeconds(30),
                            errorNumbersToAdd: null)
                        .UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery);
                });
            options.EnableSensitiveDataLogging();

Если я помещаю строку подключения в appsettings.Production.json, сайт работает хорошо, но как только я удаляю ее и добавляю EnvironmentVariables, страница выдает ошибку 500, и в журналах у меня есть:

System.ArgumentNullException: значение не может быть нулевым. (Параметр «connectionString») в Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty (строковое значение, строковое имя параметра) в Microsoft.EntityFrameworkCore.SqlServerDbContextOptionsExtensions.UseSqlServer (DbContextOptionsBuilder optionsBuilder, String connectionString, Action`1 sqlServerOptionsAction)

Ошибка указывает на строку, отмеченную в приведенном выше коде вторым HERE.

Я устанавливаю переменные среды следующим образом:

введите здесь описание изображения


person serge    schedule 02.06.2021    source источник
comment
Делаете ли вы что-то другое в Program.cs при создании компоновщика хостов? Вы пытались закрыть VS и снова открыть после создания env var? Среда, вероятно, загружается только один раз и кэшируется.   -  person DavidG    schedule 02.06.2021
comment
@DavidG, речь идет не о Visual Studio, а о производстве. В продакшене обычно нет Visual Studio, которая является веб-сервером.   -  person serge    schedule 02.06.2021


Ответы (2)


Конфигурация по умолчанию загружает переменные среды и аргументы командной строки с префиксами DOTNET_ и ASPNETCORE_.

Исходя из этого, вы должны использовать

ASPNETCORE_ConnectionStrings__MyWebApp or ASPNETCORE_ConnectionStrings:MyWebApp

Можно настроить собственный префикс с AddEnvironmentVariables:

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddEnvironmentVariables(prefix: "MyCustomPrefix_");
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}
person Antonio Falcão Jr.    schedule 02.06.2021

Наконец мне удалось заставить его работать. Мое решение состояло в том, чтобы использовать SQLCONNSTR_MyWebApp (как переменную System, а не User) и после любого изменения переменных среды для приложения, чтобы примите это во внимание, выполните net stop was /y, а затем net start w3svc из командной строки (документы)

Перезапуск IIS из диспетчера IIS не перезагружает должным образом изменения в переменных среды...

person serge    schedule 04.06.2021
comment
Вы можете выполнить шаги 3 и 4 из того, что я объяснил здесь - person CodeNotFound; 04.06.2021