当我使用生产(基本应用程序服务)插槽时,为什么Azure应用程序服务不能可靠地读取我的连接字符串

时间:2018-09-06 19:09:18

标签: c# azure asp.net-core-2.1 azure-app-service-envrmnt azure-deployment-slots

我有一个ASP.NET Core 2.1 API,我正在将该API部署到Azure应用服务。我将Azure SQL Server用于支持数据库。

下面是App Service(基本)“应用程序设置”刀片的屏幕截图。这显示.Net Framework版本设置为4.7。

enter image description here

我为App Service设置了部署槽。

对于每个部署插槽,我在“应用程序设置”刀片中都有连接字符串,具有特定于该插槽数据库的值(每个插槽有3个不同的数据库,而我有3个插槽)。

QA和DEV插槽已经运行了好几个月,但是,我们现在正在使用Production插槽(应用服务基础)将API扩展到Beta站点,并且似乎Production插槽中的连接字符串App Service读取不可靠。具体而言,似乎没有可靠地读取第二和第三连接字符串。

这是App Service->“应用程序设置”刀片的屏幕快照,其中显示了连接字符串;

enter image description here

如您所见,我已经为每个设置检查了“广告位设置”。 HangfireDbConnectioinString总是无法读取,而UspsReferenceDbConnectionString似乎很不稳定,但这可能是因为Hangfire数据库未设置并引发异常。

我对QA和DEV插槽使用了相同的设置,它们工作正常。仅生产版位(基本App Service)设置会发生此问题。

如果我在API的AppSettings.json文件中包含实际的连接字符串并将其重新部署到生产插槽,则该API能够正确访问数据库。当然,这不是理想的解决方案,因为它会将我的连接字符串置于源代码管理中。

如果有问题,请参见基本App Service Extensions刀片的屏幕截图。

enter image description here

下面是我的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中检索连接字符串。

有什么想法吗?

0 个答案:

没有答案