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

У меня есть API-интерфейс ASP.NET Core 2.1, который я развертываю в службе приложений Azure. Я использую Azure SQL Server для своих баз данных.

Ниже приведен скриншот блейда "Настройки приложения" службы приложений (базы). Это показывает, что версия.Net Framework установлена ​​на 4.7.

У меня есть служба приложений, настроенная со слотами для развертывания.

Для каждого слота развертывания у меня есть строки подключения в блейде Application Settings со значениями, специфичными для баз данных этого слота (у меня есть 3 разные базы данных для каждого слота, и у меня есть 3 слота).

Слоты QA и DEV работали просто отлично в течение нескольких месяцев, однако сейчас мы внедряем API на бета-сайты, используя слот Production (база службы приложений), и кажется, что строки соединения в слоте Production для службы приложений не надежно читать. В частности, кажется, что 2-я и 3-я строки соединения не читаются надежно.

Вот снимок экрана приложения-службы -> Настройка приложения, показывающий строки подключения;

Как видите, у меня проверены настройки слотов. HangfireDbConnectioinString всегда не читается, и UspsReferenceDbConnectionString кажется некорректным, но это может быть из-за того, что база данных Hangfire не настраивается и выдает исключение.

Я использую эту же настройку для слотов QA и DEV, и они работают нормально. Эта проблема возникает только с настройками производственного слота (базовая служба приложений).

Если я включу фактические строки подключения в файл AppSettings.json моего API и повторно разверну их в слоте Production, API сможет правильно обращаться к базам данных. Конечно, это нежелательное решение, потому что оно помещает мои строки подключения в систему контроля версий.

В случае, если это важно, вот скриншот базового блейда расширений службы приложений.

Ниже приведен раздел кода в моем Startup.cs, который настраивает базы данных.

    protected virtual void ConfigureDatabase(IServiceCollection services)
    {

        var sqlTransientErrors = new List<int>() { 10928, 10929, 10053, 10054, 10060, 40197, 40540, 40613, 40143, 64 };

        // Configure DBContexts with resilient SQL connections to SQL Server
        services.AddDbContext<ManifestContext>(options =>
        {
            options.UseSqlServer(Configuration.GetConnectionString("ManifestDbConnectionString"),
                sqlOptions =>
                {
                    sqlOptions.EnableRetryOnFailure(5, TimeSpan.FromSeconds(30),
                        sqlTransientErrors);
                    sqlOptions.CommandTimeout(Convert.ToInt32(Configuration["DbSettings:ManifestDbCommandTimeout"]));
                });
        });

        services.AddDbContext<UspsReferenceContext>(options =>
        {
            options.UseSqlServer(Configuration.GetConnectionString("UspsReferenceDbConnectionString"),
                sqlOptions =>
                {
                    sqlOptions.EnableRetryOnFailure(5, TimeSpan.FromSeconds(30), sqlTransientErrors);
                    sqlOptions.CommandTimeout(Convert.ToInt32(Configuration["DbSettings:UspsReferenceDbCommandTimeout"]));
                });
        });

        // Hangfire persistence store for background tasks
        services.AddHangfire(configuration =>
            configuration.UseSqlServerStorage(Configuration.GetConnectionString("HangfireDbConnectionString")));


    }

Как вы можете видеть, я использую Configuration.GetConnectionString("HangfireDbConnectionString") для получения строки подключения из конфигурации.

Есть идеи?

1 ответ

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

Но в настоящее время я исследую аналогичную проблему, и я думаю, что происходит то, что код Startup.cs запускается только один раз и не запускается повторно после замены слота развертывания, поскольку приложение уже прогрето. Поскольку вы читаете конфигурацию один раз в файле startup.cs и сохраняете ее при загрузке приложения (а не перечитываете ее каждый раз, когда вам это нужно), вы можете загружать значения из своего слота развертывания и не заменять их после переключения в рабочую среду.

Другие вопросы по тегам