Я использую RestSharp для связи с веб-API .Net Core. И клиент, и сервер написаны мной.
У меня есть набор служб, наследующих базовый класс, который содержит асинхронный метод для выполнения запроса через RestClient. Вот метод в базовом классе, который создает RestClient.
private async Task<ServiceResponse> RequestAsync(ServiceRequest request)
{
try
{
var result = await new RestClient(_digiCore.Config.GetApiBaseUrl()).ExecuteTaskAsync(request.Request, request.CancellationTokenSource.Token);
switch (result.StatusCode)
{
case HttpStatusCode.OK:
case HttpStatusCode.Created:
case HttpStatusCode.NoContent:
return new ServiceResponse
{
Code = ServiceResponseCode.Success,
Content = result.Content
};
// User wasn't authenticated for this one - better luck next time!
case HttpStatusCode.Unauthorized:
Logger.LogError($"Unauthorized {request.Method.ToString()}/{request.Path}");
default:
Logger.LogError($"An error occurred {request.Method.ToString()}/{request.Path}");
}
}
catch (Exception e)
{
Logger.LogError($"A Rest Client error occurred {request.Method.ToString()}/{request.Path}");
}
}
Насколько я понимаю, RestClient (в отличие от HttpClient) является потокобезопасным и позволяет каждый раз создавать новый экземпляр.
При нагрузочном тестировании моего приложения, когда я достиг определенного момента, я обнаружил, что иногда получаю следующий ответ от API. Обновление страницы может вернуть правильный результат, или я могу получить еще одну ошибку. По окончании нагрузочного теста все возвращается в нормальное состояние. В числах нагрузочного теста нет ничего сумасшедшего, поэтому меня начали беспокоить реальные характеристики ...
Only one usage of each socket address (protocol/network address/port) is normally permitted
Я полагаю, что это связано с исчерпанием портов. И API, и клиент работают в Azure как службы приложений.
Я попытался сделать RestClient частью одноэлементной службы и проверил, что он создается только один раз, но это не решило проблему.
Я также изучил возможность установки DefaultConnectionLimit в функции запуска моего класса запуска со значения по умолчанию (2) на 12, но я также не заметил никаких улучшений.
Я действительно изо всех сил пытаюсь понять, как я могу это улучшить ... Любая помощь будет принята с благодарностью