我们正在托管一个。net 5 WebApi (ASP. net)。使用实体框架6.4.4(非核心)连接到Azure SQL数据库。
每隔一段时间,调用我们的API失败,因为这个异常:The underlying provider failed on Open. Login failed for user 'myuser'.
我们知道我们有正确的用户和密码,因为错误会在几秒钟后自行消失。我们正在使用SqlAzureExecutionStrategy
,但这不是重试特定的错误代码(18456)。
解决这个问题的好方法是什么?我们应该简单地重试这个错误代码,还是有更好的解决方案?
我们当前设置了以下配置:
[DbConfigurationType(typeof(DatabaseConfiguration))]
public class MyDataContext: DbContext, IMyContext
{...}
public class DatabaseConfiguration : DbConfiguration
{
public DatabaseConfiguration()
{
SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
SetDefaultConnectionFactory(new LocalDbConnectionFactory("mssqllocaldb"));
SetProviderServices("System.Data.SqlClient", SqlProviderServices.Instance);
}
}
我自己最好的猜测是扩展执行策略。
我在GitHub上发现了一个类似的讨论,但它涉及AAD认证而不是用户名/密码。
public class CustomExecutionStrategy : SqlAzureExecutionStrategy
{
protected override bool ShouldRetryOn(Exception ex)
{
if (ex is SqlException sqlex)
{
foreach (SqlError err in sqlex.Errors)
{
// Error number found here https://github.com/dotnet/SqlClient/issues/617#issuecomment-649686544
if (err.Number == 18456)
{
return true;
}
}
}
return base.ShouldRetryOn(ex);
}
}