Azure部署的ASP.NET Core 2.1应用HttpClient请求无响应问题排查
Azure Web App上ASP.NET Core 2.1 HttpClient调用Face API停止响应的解决办法
我之前碰到过好几个类似的场景——本地跑完全正常,一部署到Azure Web App就出现HttpClient罢工的情况,结合你描述的150-250次请求后失效的现象,咱们从几个方向来排查和解决:
一、先排查HttpClient的使用方式是否规范
ASP.NET Core里的HttpClient可不是随便用的,哪怕你用了构造注入,细节没做好也会出问题:
1. 确保HttpClient通过DI正确注册并配置
在Startup.cs的ConfigureServices里,别只简单注册,要加上必要的配置(超时、重试、连接池):
using Polly; using System.Net.Http; public void ConfigureServices(IServiceCollection services) { // 注册FaceApiHttpClient并配置HttpClient services.AddHttpClient<FaceApiHttpClient>(client => { client.BaseAddress = new Uri("https://your-face-api-region.api.cognitive.microsoft.com/"); client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "your-face-api-key"); // 设置合理的超时,避免请求挂起占用连接 client.Timeout = TimeSpan.FromSeconds(30); }) // 添加重试策略,处理Face API的临时错误(比如限流、网络波动) .AddPolicyHandler(GetRetryPolicy()) // 配置连接池参数,避免连接耗尽 .ConfigurePrimaryHttpMessageHandler(() => { var handler = new HttpClientHandler(); // 根据Azure的限制和你的请求量调整,比如设为100 handler.MaxConnectionsPerServer = 100; return handler; }); // 其他服务注册... } // 定义Polly重试策略 private static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy() { return Policy .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode) .Or<HttpRequestException>() .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); // 指数退避重试 }
2. 避免异步代码里的阻塞调用
你的FaceApiHttpClient里的方法一定要全程用await,绝对不能用.Result或者.Wait(),这会导致线程死锁,尤其是在ASP.NET Core的上下文里:
public async Task<string> DetectFaceAsync(string base64Image) { var requestBody = new { url = "", base64Image = base64Image }; // 根据Face API的请求格式调整 var content = new StringContent(JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json"); var response = await _client.PostAsync("/face/v1.0/detect", content); // 确保请求失败时抛出异常,让重试策略生效 response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync(); }
二、检查Azure Web App的环境限制
本地没问题,Azure上出问题,很大概率是Azure的资源限制在搞鬼:
- 层级限制:如果用的是免费层(F1)或者共享层(D1),这类层级的出站连接数和WebSocket连接数都有严格限制(比如免费层WebSocket连接最多35个)。当你的WebSocket连接+HttpClient出站连接达到上限后,就会出现请求卡住的情况。建议临时升级到基本层(B1)试试,看看问题是否消失。
- WebSocket配置:你用到了WebSocket传输图片,一定要在Azure门户的应用服务“配置”->“常规设置”里,确保“WebSocket”选项是启用状态,否则WebSocket连接会异常断开,也可能间接影响HttpClient的使用。
- 日志排查:打开Azure门户的“监视”->“日志流”,实时查看应用日志和HTTP日志,看看停止响应时有没有出现“套接字耗尽”“连接超时”“限流”这类错误信息,这些日志能帮你定位具体问题。
三、WebSocket连接的额外注意事项
因为你用WebSocket传输Base64图片,长连接可能会占用不少资源:
- 确保WebSocket连接在使用完成后正确关闭,不要让闲置的长连接一直占用资源。
- 如果同时有大量WebSocket连接,可以考虑优化图片传输方式(比如直接传二进制而非Base64,减少数据量),或者限制并发WebSocket连接数。
按照上面的步骤调整后,应该能解决HttpClient停止响应的问题。
内容的提问来源于stack exchange,提问作者Norbert Pisz
相关产品推荐
相关产品推荐

