В моей размещенной службе веб-API ASP.NET Core я делаю непрерывные запросы HTTP-клиента и одновременно выполняю 10 запросов с использованием задач. Проблема, с которой я столкнулся, заключается в том, что через некоторое время служба зависает и перестает регистрировать любые сообщения. Он даже не вызывает StopAsync() и не перехватывает исключение в методе ExecuteAsync службы, в которой я регистрирую шаги. Я здесь в принципе ничего не понимаю. Я чувствую, что разместил 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;
}
Я пытался установить тайм-аут для задачи, как показано ниже, но безуспешно
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;
});
Подробнее здесь: https://stackoverflow.com/questions/793 ... s-requests
ASP.NET Core HttpClient не отвечает после нескольких непрерывных запросов ⇐ C#
Место общения программистов C#
1737486596
Anonymous
В моей размещенной службе веб-API ASP.NET Core я делаю непрерывные запросы HTTP-клиента и одновременно выполняю 10 запросов с использованием задач. Проблема, с которой я столкнулся, заключается в том, что через некоторое время служба зависает и перестает регистрировать любые сообщения. Он даже не вызывает StopAsync() и не перехватывает исключение в методе ExecuteAsync службы, в которой я регистрирую шаги. Я здесь в принципе ничего не понимаю. Я чувствую, что разместил 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;
}
Я пытался установить тайм-аут для задачи, как показано ниже, но безуспешно
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;
});
Подробнее здесь: [url]https://stackoverflow.com/questions/79375455/asp-net-core-httpclient-doesnt-respond-after-several-continuos-requests[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия