У меня есть 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 сможет правильно обращаться к базам данных. Конечно, это нежелательное решение, потому что оно помещает мои строки подключения в систему контроля версий.
На случай, если это имеет значение, приведен скриншот базового блейда App Service Extensions.
Ниже приведен раздел кода в моем файле 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") для получения строки подключения из конфигурации.
Есть идеи?