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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:47:50