3

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 から接続文字列を取得しています。

何か案は?

4

1 に答える 1