Azure Function访问Azure SQL数据库遇瞬态错误及超时问题
尝试从同一Azure账号下的Function App访问Azure托管数据库时,遇到以下错误:
已引发可能由瞬态故障导致的异常。请考虑在UseSqlServer调用中添加'EnableRetryOnFailure'以启用瞬态错误恢复。
添加EnableRetryOnFailure后,最终返回超时错误。
program.cs中的核心代码如下:
string connectionString = Environment.GetEnvironmentVariable("DefaultConnection"); services.AddDbContext<VladbContext>(options => options.UseSqlServer(connectionString), ServiceLifetime.Transient);
技术栈:.NET 7 + Entity Framework Core,EF Core代码与Blazor应用共享(Blazor应用运行完全正常),Function本地连接本地数据库时也能正常工作。
更新1:初始日志错误信息
"Exception: System.AggregateException: 发生一个或多个错误。
(重试4次后失败。可在ClientOptions.Retry中调整重试设置,或通过在ClientOptions.RetryPolicy中配置自定义重试策略。 (连接尝试失败,因为连接方在一段时间后未正确响应,或者已建立的连接失败,因为连接的主机未能响应。 (ourserver.vault.azure.net:443)) (连接尝试失败,因为连接方在一段时间后未正确响应,或者已建立的连接失败,因为连接的主机未能响应。 (ourserver.vault.azure.net:443)) (连接尝试失败,因为连接方在一段时间后未正确响应,或者已建立的连接失败,因为连接的主机未能响应。 (ourserver.vault.azure.net:443)) (连接尝试失败,因为连接方在一段时间后未正确响应,或者已建立的连接失败,因为连接的主机未能响应。 (ourserver.vault.azure.net:443)))"
更新2:配置SQL Server访问密钥保管库后的错误
2023-12-28T14:26:58.830 [Error] 使用与服务器tcp:ourSQLserver.database.windows.net,1433上的数据库'ourSQLdB'的连接时发生错误。
2023-12-28T14:26:58.892 [Error] 遍历上下文类型App.DataService.Models.VladbContext的查询结果时发生异常。
System.InvalidOperationException: 引发了可能由瞬态故障导致的异常。考虑通过在'UseSqlServer'调用中添加'EnableRetryOnFailure'来启用瞬态错误恢复。
---> Microsoft.Data.SqlClient.SqlException (0x80131904): 建立与SQL Server的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服务器。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。(provider: TCP Provider, error: 0 - 连接尝试失败,因为连接方在一段时间后未正确响应,或者已建立的连接失败,因为连接的主机未能响应。)
---> System.ComponentModel.Win32Exception (10060): 连接尝试失败,因为连接方在一段时间后未正确响应,或者已建立的连接失败,因为连接的主机未能响应。 at
Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException
exception, Boolean breakConnection, Action`1 wrapCloseInAction)
- 检查SQL Server防火墙规则:
- 将Function App的所有出站IP地址(含VIP)添加到SQL Server防火墙允许列表;若使用消费计划,直接启用“允许Azure服务和资源访问此服务器”选项。
- 验证连接字符串配置:
- 确认
DefaultConnection中的服务器地址格式为tcp:xxx.database.windows.net,1433,数据库名、身份验证信息无误;若连接字符串存储在密钥保管库,需为Function App配置系统托管标识,并在密钥保管库访问策略中添加该标识的“机密读取”权限。
- 确认
- 优化EF Core连接配置:
调整UseSqlServer的重试与超时参数:services.AddDbContext<VladbContext>(options => options.UseSqlServer(connectionString, sqlOptions => { sqlOptions.EnableRetryOnFailure(5, TimeSpan.FromSeconds(30), null); sqlOptions.CommandTimeout(60); // 延长命令超时时间 }), ServiceLifetime.Transient); - 排查Function App网络限制:
- 若启用虚拟网络集成,确认虚拟网络与SQL Server的对等连接配置正确,或SQL Server防火墙允许该虚拟网络的流量;
- 检查网络安全组(NSG)规则,确保未限制Function App访问SQL Server的1433端口和密钥保管库的443端口。
内容的提问来源于stack exchange,提问作者coolblue2000

