Azure App Service にデプロイする ASP.NET Core 2.1 API があります。バッキング データベースに Azure SQL Server を使用しています。
以下は、App Service (ベース) アプリケーション設定ブレードのスクリーンショットです。これは、.Net Framework のバージョンが 4.7 に設定されていることを示しています。
デプロイ スロットを使用して App Service をセットアップしました。
デプロイ スロットごとに、[アプリケーションの設定] ブレードに、そのスロット データベースに固有の値を持つ接続文字列があります (スロットごとに 3 つの異なるデータベースがあり、3 つのスロットがあります)。
QA スロットと DEV スロットは数か月間問題なく動作していましたが、現在、運用スロット (App Service ベース) を使用して API をベータ サイトにロールアウトしています。信頼できる読み取りではありません。具体的には、2 番目と 3 番目の接続文字列が確実に読み取られていないようです。
これは、App Service --> [アプリケーション設定] ブレードのスクリーンショットで、接続文字列が表示されています。
ご覧のとおり、それぞれのスロット設定にチェックを入れています。HangfireDbConnectioinString は常に読み取りに失敗し、UspsReferenceDbConnectionString は不安定に見えますが、これは Hangfire データベースがセットアップされておらず、例外がスローされていることが原因である可能性があります。
QA スロットと DEV スロットに同じセットアップを使用すると、問題なく動作します。この問題は、運用スロット (ベース App Service) 設定でのみ発生します。
API の AppSettings.json ファイルに実際の接続文字列を含めて、それを 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") を使用して Configuration から接続文字列を取得しています。
何か案は?