Docker化ASP.NET Core Web API调用Azure SQL报错,本地运行正常
Docker化.NET Core项目连接Azure SQL的瞬态故障问题解决
我在Docker化的.NET Core项目中调用API时遇到如下异常:
已引发可能由瞬态故障导致的异常。请考虑在
UseSqlServer调用中添加EnableRetryOnFailure以启用瞬态错误恢复能力。
该项目在Visual Studio本地运行时完全正常,我已经在Azure SQL的防火墙设置中添加了IP白名单,当前使用的连接字符串如下:
Server=tcp:tweetapp-server.database.windows.net,1433;Initial Catalog=tweetappapi;User ID=admin;Password={password};Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;
解决步骤
1. 启用EF Core瞬态错误重试机制
按照异常提示,在DbContext配置中添加EnableRetryOnFailure,这是Azure SQL瞬态故障的标准修复方案:
services.AddDbContext<YourDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("YourConnStringName"), sqlOptions => sqlOptions.EnableRetryOnFailure( maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null ) ) );
2. 确认Docker容器的出口IP已加入白名单
本地运行正常但Docker容器失败,大概率是容器的公网出口IP不在Azure SQL防火墙允许列表内:
- 在容器内执行
curl ifconfig.me获取公网IP - 将该IP添加到Azure SQL的防火墙规则中
3. 优化连接字符串
针对Docker和Azure环境,调整连接字符串参数:
- 延长连接超时到60秒,给网络请求更多缓冲时间
- 启用多活动结果集,避免查询阻塞
- 确保
{password}已替换为实际密码
优化后的连接字符串示例:
Server=tcp:tweetapp-server.database.windows.net,1433;Initial Catalog=tweetappapi;User ID=admin;Password=你的实际密码;Encrypt=True;TrustServerCertificate=False;Connection Timeout=60;MultipleActiveResultSets=True;
4. 验证容器网络连通性
在Docker容器内测试端口连通性:
- 用
telnet tweetapp-server.database.windows.net 1433检查1433端口是否可达 - 若没有telnet,可安装
nc工具执行nc -zv tweetapp-server.database.windows.net 1433
如果端口不通,需排查Docker网络配置或公司防火墙的出站规则。
内容的提问来源于stack exchange,提问作者Atman Das
相关产品推荐
相关产品推荐

