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
相关产品推荐
相关产品推荐

