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);
Надеюсь, это кому-нибудь поможет.