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

ASP.NET Core HttpClient连续请求后无响应问题排查

问题排查:ASP.NET Core托管服务批量HTTP请求后挂起

在ASP.NET Core Web API托管服务中,通过Task并行执行10个HTTP客户端请求,运行一段时间后服务挂起,停止输出日志,既不触发StopAsync(),也不在ExecuteAsync方法中捕获异常。已确保代码中正确释放HttpClient和HttpResponse,尝试为Task设置5分钟超时也无效。日志显示某批次请求发出后部分响应返回,随后无日志输出。

核心代码

批量处理逻辑

var users = GetUsersFromDB.ToList();

userBatches = users.Chunk(10).ToList(); 
        
var clientUserFacades = new List<ClientUserFacade>();

foreach (var UserBatch in UserBatches)
{
    logger.LogMessage(LogLevel.Information, hostedServiceType, "User batch index {UserBatchNo} - Processing started", UserBatches.IndexOf(UserBatch));

    try
    {
        var tasks = UserBatch.Select(User => clientUserSendHandler.SendUserInfoToClient(hostedServiceType, client, User, false));

        var results = await Task.WhenAll(tasks);

        clientUserFacades.AddRange(results.Where(p => p.IsResponseValid));
    }
    catch (Exception ex)
    {
        logger.LogMessage(LogLevel.Error, hostedServiceType, ex, "Batch processing task cancelled. Skipping the current batch. Trying after 10 seconds!");
        await Task.Delay(TimeSpan.FromSeconds(10), CancellationToken.None);
        continue;
    }

    logger.LogMessage(LogLevel.Information, hostedServiceType, "User batch index {UserBatchNo} client send completed", UserBatches.IndexOf(UserBatch));

    if (UserBatches.IndexOf(UserBatch) % 50 == 0 || UserBatches.ToList().IndexOf(UserBatch) == (UserBatches.Count - 1))
    {
        await clientUserWriteHandler.BulkUpdateClientUserAsync(hostedServiceType, client, clientUserFacades); // database update

        clientUserFacades.Clear();

        logger.LogMessage(LogLevel.Information, hostedServiceType, "User batches updated to database at batch index {UserBatchNo}", UserBatches.IndexOf(UserBatch));
    }
}

HTTP请求发送方法

public async Task<ClientUserFacade> SendUserInfoToClient(HostedServiceType hostedServiceType, ClientFacade client, User User, bool includeResponseContent=false)
{
    var UserName = CommonHelper.RemoveWhiteSpaceAndSpecialCharacters(User.Name);
    var UserMobileNo = CommonHelper.RemoveNonNumericCharacters(User.MobileNo);
    
    var clientUser = new ClientUserFacade
           {
               ClientId = client.Id,
               UserId = User.Id
           };

    var param = new Dictionary<string, string>
               {
                   { "name", UserName },
                   { "phone", UserMobileNo }
               };
    
    try
    {
        var requestUrl = new Uri(QueryHelpers.AddQueryString(client.ApiUrl, param!));
    
        clientUser.LastRequestTimestamp = DateTime.Now.ToUniversalTime();

        using var httpClient = httpClientFactory.CreateClient();
        using var response = await httpClient.GetAsync(requestUrl);
    
        if (response.IsSuccessStatusCode)
        {
            var data = await response.Content.ReadAsStringAsync();
    
            if (includeResponseContent)
            {
                clientUser.ResponseContent = data;
            }
    
            var responseObject = JObject.Parse(data);
    
            ProcessClientReponse(clientUser, responseObject);
        }
        else
        {
            var logMessage = $"Request unsuccessful with response Code {(int)response.StatusCode} for client api request of User [{UserName} | {UserMobileNo}]";
    
            LogMessage(LogLevel.Error, hostedServiceType, null, logMessage);
    
            if (includeResponseContent && response is { })
            {
                clientUser.LastResponseCode = (int)response.StatusCode;
    
                var data = await response.Content.ReadAsStringAsync();
    
                clientUser.ResponseContent = data;
            }
        }
    }
    catch (Exception ex)
    {
        var logMessage = $"Unexpected error during client api request of User [{UserName} | {UserMobileNo}]";
    
        LogMessage(LogLevel.Critical, hostedServiceType, ex, logMessage);
    }
    
    return clientUser;
}

尝试的超时处理代码

var tasks = userBatch.Select(async User =>
                {
                    var sendTask = clientUserSendHandler.SendUserInfoToClient(hostedServiceType, client, User);
                    var timeoutTask = Task.Delay(TimeSpan.FromMinutes(5));

                    var completedTask = await Task.WhenAny(sendTask, timeoutTask);

                    if (completedTask == timeoutTask)
                    {
                        logger.LogMessage(LogLevel.Warning, hostedServiceType, $"Task for User [{User.Name} | {User.MobileNo}] cancelled after waiting for 5 mins");
                        return new ClientUserFacade { ClientId = client.Id, UserId = User.Id, IsResponseValid = false };
                    }

                    return await sendTask;
                });             

相关日志信息

2025-01-22 13:42:59.4582 INFO clientService : User batch index 182 - Processing started
2025-01-22 13:42:59.4582 INFO Start processing HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=PraveenM&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Sending HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=PraveenM&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Start processing HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=Sunil&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Sending HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=Sunil&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Start processing HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=Vijays&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Sending HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=Vijays&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Start processing HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=Raj&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Sending HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=Raj&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Start processing HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=lipunSethi&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Sending HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=lipunSethi&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Start processing HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=RasmiRai&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Sending HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=RasmiRai&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Start processing HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=MahadevaAchare&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Sending HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=MahadevaAchare&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Start processing HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=balarajuns&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Sending HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=balarajuns&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Start processing HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=MangalNishad&phone=xxxxxxxxxx
2025-01-22 13:42:59.4582 INFO Sending HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=MangalNishad&phone=xxxxxxxxxx
2025-01-22 13:42:59.4741 INFO Start processing HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=Suhaib&phone=xxxxxxxxxx
2025-01-22 13:42:59.4741 INFO Sending HTTP request GET https://api.Userconnect.com/client/client-crm.php?name=Suhaib&phone=xxxxxxxxxx

请排查代码中可能存在的问题。

内容的提问来源于stack exchange,提问作者Kuntady Nithesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:57:02