Restsharp: базовая связь была закрыта

У меня проблемы с использованием клиента RestSharp в службе Windows. Когда API не работает, соединение теряется. Но как только API запускается снова, остальной клиент продолжает выдавать ту же ошибку. Даже если я настрою новый экземпляр RestClient.

Кто-нибудь с той же проблемой и рабочим решением или предложением?

2 ответа

Я коллега Людвига. Наше приложение запускается и подключается к API, приложение продолжает работать и вызывает API. Когда API-интерфейс внезапно отключается (перезапускается), наше приложение получает сообщение об ошибке: Базовое соединение было закрыто: Соединение, которое, как предполагалось, оставалось живым, было закрыто сервером, и мы вызываем функции InitODataClient и ReadConfigAsync для воссоздания restClient. Когда API снова заработал, мы ожидали, что RestClient снова заработает, но мы продолжаем получать: основное соединение закрыто. не удалось установить безопасный канал для ssl / tls. Когда мы перезапускаем наше приложение, все снова работает. Там нет проблем с сертификатом. Кажется, что для создания нового объекта RestClient используется старое (недействительное) соединение. Часть кода, который мы используем:

private RestClient restClient;

    private void InitODataClient()
    {
        restClient = new RestClient(options.BaseUrl);
        restClient.AddDefaultHeader("Authorization", "Bearer " + options.AccessToken);
    }

    private async Task ReadConfigAsync()
    {
            var requestApplication = new RestRequest("Applications/" + Guid.Parse(applicationId));
            var response = await restClient.ExecuteGetTaskAsync<Application>(requestApplication);
//Here the response contains the underlying connection is closed error
    }

    public async Task RestartAsync()
    {
        Stop();
        do
        {
            try
            {
                Logger.Log("Trying to reconnect to the server in 5 seconds...");
                Thread.Sleep(5000);
                InitODataClient();
                ReadConfigAsync().Wait();
                break;
            }
            catch (Exception) { }
        }
        while (true);
    }

В основном это, кажется, ошибка согласования SSL/TLS. Чтобы убедиться в этом, перед созданием RestClient вы можете установить ServicePointManager.SecurityProtocol, как показано в следующем примере:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
restClient = new RestClient(options.BaseUrl);

Надеюсь, это кому-нибудь поможет.

Другие вопросы по тегам