You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure SQL Database临时性登录错误18456解决方案咨询

问题根因与最优方案

你遇到的偶发18456登录失败属于Azure SQL的典型瞬态故障,多由数据库节点切流、瞬时资源限流导致,并非真实凭证错误,将该错误码加入重试范围是完全合理的,也是该场景的最优解决方案。

默认SqlAzureExecutionStrategy没有把18456错误码纳入重试列表,是因为通用场景下18456代表凭证配置错误,属于非瞬态错误,但Azure SQL的托管架构下会出现临时登录拒绝的瞬态18456报错,符合重试条件。

具体实现步骤

1. 自定义执行策略

继承SqlAzureExecutionStrategy,重写ShouldRetryOn方法,将18456加入瞬态错误码列表:

using System.Data.Entity.SqlServer;
using System.Data.SqlClient;

public class CustomSqlAzureExecutionStrategy : SqlAzureExecutionStrategy
{
    // 可自定义重试次数和最大间隔,默认配置为最多5次重试,指数退避最大间隔25秒
    public CustomSqlAzureExecutionStrategy() : base() { }
    
    public CustomSqlAzureExecutionStrategy(int maxRetryCount, TimeSpan maxDelay) 
        : base(maxRetryCount, maxDelay) { }

    protected override bool ShouldRetryOn(Exception exception)
    {
        if (exception is SqlException sqlEx)
        {
            foreach (SqlError error in sqlEx.Errors)
            {
                // 将18456错误码加入重试范围
                if (error.Number == 18456)
                {
                    return true;
                }
            }
        }
        // 保留原有默认的瞬态错误重试逻辑
        return base.ShouldRetryOn(exception);
    }
}

2. 替换原有配置

修改你的DatabaseConfiguration类,将执行策略替换为自定义实现:

public class DatabaseConfiguration : DbConfiguration
{
    public DatabaseConfiguration()
    {
        // 替换为自定义的Azure SQL执行策略
        SetExecutionStrategy("System.Data.SqlClient", () => new CustomSqlAzureExecutionStrategy());
        SetDefaultConnectionFactory(new LocalDbConnectionFactory("mssqllocaldb"));
        SetProviderServices("System.Data.SqlClient", SqlProviderServices.Instance);
    }
}
注意事项
  • 确保已经彻底排查非瞬态18456场景:比如数据库账号密码没有动态变更、应用IP已经加入Azure SQL白名单、账号没有被临时锁定,避免真实凭证错误时无效重试
  • 对于非幂等的数据库写操作,建议配合操作幂等校验逻辑,避免重试导致重复写入数据
  • 可根据实际业务场景调整重试次数和最大间隔,比如对延迟敏感的接口可以调低最大重试次数和间隔

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:45:03