ASP.NET Core HttpClient не отвечает после нескольких непрерывных запросовC#

Место общения программистов C#
Ответить
Anonymous
 ASP.NET Core HttpClient не отвечает после нескольких непрерывных запросов

Сообщение Anonymous »

В моей размещенной службе веб-API ASP.NET Core я делаю непрерывные запросы HTTP-клиента и одновременно выполняю 10 запросов с использованием задач. Проблема, с которой я столкнулся, заключается в том, что через некоторое время служба зависает и перестает регистрировать любые сообщения. Он даже не вызывает StopAsync() или не перехватывает исключение в методе excuteAsync службы, где я регистрирую шаги. Я здесь в принципе ничего не понимаю. Я чувствую, что разместил http-клиент и http-ответ в своем коде. Что может быть не так в моем коде?
var users = GetUsersFromDB.ToList();

userBatches = users.Chunk(10).ToList();

var clientUserFacades = new List();

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));
}

}

public async Task 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
{
{ "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;
}



Подробнее здесь: https://stackoverflow.com/questions/793 ... s-requests
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»