Получение строк подключения веб-приложения с помощью ConfigurationBuilder

Мы храним некоторые из наших чувствительных ключей и строк подключения в разделе Строки подключения в настройках приложения Web App:

Строки подключения Azure Web App

Мы получаем параметры конфигурации, используя ConfigurationBuilder:

Configuration = new ConfigurationBuilder()
    .SetBasePath(environment.ContentRootPath)
    .AddEnvironmentVariables()
    .Build();

Я бы ожидал AddEnvironmentVariables() подобрать эти строки соединения, но это не так. Обратите внимание, что это работает, если вы установите эти значения как "Настройки приложения" в веб-приложении.

При более внимательном рассмотрении (с использованием консоли Kudu) я обнаружил, что переменные среды, устанавливаемые для этих строк соединений, имеют префикс CUSTOMCONNSTR_ к имени ключа:

CUSTOMCONNSTR_MongoDb:ConnectionString=...
CUSTOMCONNSTR_Logging:ConnectionString=...
CUSTOMCONNSTR_ApplicationInsights:ChronosInstrumentationKey=...

Как мне теперь читать в этих строках соединения, используя ConfigurationBuilder?

РЕДАКТИРОВАТЬ:

Я нашел это удобным AddEnvironmentVariables перегрузка существует с prefix параметр, описываемый как:

//   prefix:
//     The prefix that environment variable names must start with. The prefix will be
//     removed from the environment variable names.

Но добавляя .AddEnvironmentVariables("CUSTOMCONNSTR_") к компоновщику конфигурации тоже не работает!

2 ответа

Решение

Но добавление.AddEnvironmentVariables("CUSTOMCONNSTR_") в конструктор конфигурации также не работает!

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

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

Configuration.GetConnectionString("MongoDb:ConnectionString");

Для настройки иерархической структуры добавьте ее в настройки приложения вместо строк подключения на портале Azure.

Как мне теперь читать в этих строках соединения, используя ConfigurationBuilder?

В качестве обходного пути вы можете повторно добавить EnvironmentVariable и перестроить ConfigurationBuilder после получения строки подключения. Код ниже для вашей справки.

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

    Configuration = builder.Build();
    //Add EnvironmentVariable and rebuild ConfigurationBuilder
    Environment.SetEnvironmentVariable("MongoDb:ConnectionString", Configuration.GetConnectionString("MongoDb:ConnectionString"));
    builder.AddEnvironmentVariables();
    Configuration = builder.Build();
}

Это должно просто работать, и это работает для меня в моем примере приложения: https://github.com/davidebbo-test/AspNetCoreDemo. В частности:

  • MyDatabase Строка подключения определяется здесь.
  • Это используется здесь.
  • Если вы определите MyDatabase В строке conn в портале Azure вы увидите новое значение во время выполнения (перейдите на страницу "О программе").

Поэтому начните с проверки работоспособности шахты и постарайтесь увидеть, что вы делаете по-другому. Вы никогда не должны делать какие-либо предположения о CUSTOMCONNSTR_ префикс!