我有一个ASP.NET Core 2.1 API,我正在将该API部署到Azure应用服务。我将Azure SQL Server用于支持数据库。
下面是App Service(基本)“应用程序设置”刀片的屏幕截图。这显示.Net Framework版本设置为4.7。
我为App Service设置了部署槽。
对于每个部署插槽,我在“应用程序设置”刀片中都有连接字符串,具有特定于该插槽数据库的值(每个插槽有3个不同的数据库,而我有3个插槽)。
QA和DEV插槽已经运行了好几个月,但是,我们现在正在使用Production插槽(应用服务基础)将API扩展到Beta站点,并且似乎Production插槽中的连接字符串App Service读取不可靠。具体而言,似乎没有可靠地读取第二和第三连接字符串。
这是App Service->“应用程序设置”刀片的屏幕快照,其中显示了连接字符串;
如您所见,我已经为每个设置检查了“广告位设置”。 HangfireDbConnectioinString总是无法读取,而UspsReferenceDbConnectionString似乎很不稳定,但这可能是因为Hangfire数据库未设置并引发异常。
我对QA和DEV插槽使用了相同的设置,它们工作正常。仅生产版位(基本App Service)设置会发生此问题。
如果我在API的AppSettings.json文件中包含实际的连接字符串并将其重新部署到生产插槽,则该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中检索连接字符串。
有什么想法吗?