Azure函数应用更新API URL后连接超时,本地调试正常求排查
问题背景
我有一个使用System.Net.Http.HttpRequestMessage调用Web API的Azure函数应用,对方更新URL后,我同步更新路径并重新发布,但出现以下错误:
连接尝试失败,因为连接方在一段时间后未正确响应,或已建立的连接失败,因为连接的主机未能响应。(myapi.com:443)
内部异常:连接尝试失败,因为连接方在一段时间后未正确响应,或已建立的连接失败,因为连接的主机未能响应。
调用令牌的核心代码如下:
public static async Task<string> GetApiConnectionToken(HttpClient client, ILogger log){ client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); var dict = new Dictionary<string, string> { { "grant_type", "client_credentials" }, { "client_secret", "client_secret" }, { "client_id", "GUID" }, { "audience", "https://myapi.com/id/" } }; log.LogInformation("Cert bypass applied"); var url = @"https://myapi.com/id/getToken"; var req = new HttpRequestMessage(HttpMethod.Post, url) { Content = new FormUrlEncodedContent(dict) }; var res = await client.SendAsync(req); log.LogInformation("Token received"); var accessKey = JsonConvert.DeserializeObject<ApiCredentials>(await res.Content.ReadAsStringAsync()); return accessKey.access_token; }
本地VS2022调试正常,但Azure函数部署后无法连接。更新:在Azure函数控制台用curl调用对方新API同样失败,但调用其他公共API(如curl -v https://api.apis.guru/v2/list.json、curl -v https://jsonplaceholder.typicode.com/users)正常。已和对方协作排查但未找到根源,求其他排查思路。
排查思路
检查Azure函数的网络出站规则
确认Azure函数所在的App Service Plan是否启用VNet集成,或是否有网络安全组(NSG)限制了出站流量到myapi.com:443。可在Azure门户的App Service -> 网络 -> 出站流量规则中查看是否有拦截,或通过VNet的NSG规则检查是否允许443端口到目标域名。验证目标API的SSL证书信任情况
Azure环境的根证书列表可能与本地不同,在Azure函数控制台运行openssl s_client -connect myapi.com:443,查看证书链是否完整、是否过期或不受信任。若对方使用自签名证书,需在Azure函数应用设置中配置WEBSITE_LOAD_CERTIFICATES加载对应证书(不推荐生产环境直接跳过证书验证)。确认目标API的IP白名单配置
对方新环境可能设置了IP白名单,需在Azure门户的App Service -> 属性中获取函数的所有出站IP地址(含备用IP),提供给对方确认是否在白名单内。也可尝试启用Azure函数的出站IP固定,确保请求来自固定IP段。排查DNS解析差异
在Azure函数控制台运行nslookup myapi.com或dig myapi.com,对比解析到的IP与本地是否一致。若结果不同,可能是Azure DNS缓存问题或对方DNS的区域性配置差异,可尝试在应用设置中配置自定义DNS服务器(如8.8.8.8)测试解析情况。调整HttpClient配置
检查代码中HttpClient的超时设置(默认100秒),若对方API响应较慢可适当延长。同时确认Azure函数是否需要通过代理访问外部API,检查应用设置中HTTP_PROXY/HTTPS_PROXY的配置是否正确。启用详细日志排查
在Azure门户的App Service -> 日志 -> 应用服务日志中启用详细错误日志和HTTP日志,重新触发请求后查看日志中的具体错误细节(如TCP连接阶段错误、SSL握手失败原因)。也可在代码中添加更细致的日志,比如捕获SocketException的错误码。用Azure VM模拟函数环境测试
创建与函数同区域、同VNet的Azure VM,在VM中运行相同的curl命令或测试代码。若VM也无法连接,说明问题出在网络层面(如VNet配置、对方防火墙);若VM能连接,则问题可能出在App Service的特定配置上。
内容的提问来源于stack exchange,提问作者tvbRPTI2754

