Ответ RestSharp Обычно разрешается только одно использование каждого адреса сокета (протокол / сетевой адрес / порт).

Я использую 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, но я также не заметил никаких улучшений.

Я действительно изо всех сил пытаюсь понять, как я могу это улучшить ... Любая помощь будет принята с благодарностью


person grimdog_john    schedule 21.11.2019    source источник


Ответы (1)


Выяснили причину этого ...

Похоже, что в настоящее время существует проблема с RestSharp, из-за которой соединения сокетов не закрываются немедленно, а вместо этого остаются в состоянии TIME_WAIT.

Эта проблема в настоящее время регистрируется ребятами RestSharp здесь ->

https://github.com/restsharp/RestSharp/issues/1322

Я решил переключиться на использование HttpClient - и, выполнив точно такой же тест нагрузки, у меня не было никаких проблем.

Вот снимок экрана, сделанный из Azure, демонстрирующий разницу между двумя нагрузочными тестами.

  1. Был с моим приложением, использующим RestSharp
  2. Был с моим приложением с использованием Http Client

Надеюсь, это кому-то поможет. Жалко, что мне пришлось отказаться от RestSharp, поскольку это была небольшая симпатичная библиотека - к сожалению, с такой проблемой, запускать ее в производственной среде слишком рискованно.

введите здесь описание изображения

person grimdog_john    schedule 24.11.2019