Публикация HttpClient в api, получение исключения System.IO.IOException: Не удалось выполнить проверку подлинности, поскольку удаленная сторона закрыла транспортный поток

#c# #dotnet-httpclient

Вопрос:

Я успешно вызываю службу, используя надстройку VS RestClient (изменения, внесенные для защиты секретов).

 POST https://zzz-apis-xyz.com/abc/abc-data/v1/abcbusinessdata HTTP/1.1
X-Special-Client-Id: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
X-Special-Client-Secret: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
accept: application/json 
clientID: cccccc 
content-type: application/json 
abcDistributedKey: ---guid--- 
systemName: chicken

{
    "business": "Hilton",
    "address": "7930 Jones Branch Drive",
    "city": "McLean",
    "state": "VA",
    "postalCode": "22102"
}
 

Я пытаюсь использовать следующий код, чтобы опубликовать это в api, используя следующий C#

 var request = new ApiRequest {
  business = "Hilton Hotels",
    address = "7930 Jones Branch Drive",
    city = "McLean",
    state = "VA",
    postalCode = "22102",
};

var requestJson = JsonConvert.SerializeObject(request);

var httpRequestMessage = new HttpRequestMessage {
  Method = HttpMethod.Post,
    RequestUri = new Uri("https://zzz-apis-xyz.com/abc/abc-data/v1/abcbusinessdata"),
    Headers = {
      {
        "X-Special-Client-Id",
        "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
      },
      {
        "X-Special-Client-Secret",
        "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
      },
      {
        "clientID",
        "cccccc"
      },
      {
        "abcDistributedKey",
        Guid.NewGuid().ToString()
      },
      {
        "systemName",
        "GLASS"
      },

    },
    Content = new StringContent(requestJson, Encoding.UTF8, "application/json"),

};

using(var client = new HttpClient(new HttpClientHandler {
  UseDefaultCredentials = true
})) {
  client.BaseAddress = new Uri("https://zzz-apis-xyz.com/");

  client.DefaultRequestHeaders.Accept.Clear();
  client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

  try {
    var response = await client.SendAsync(httpRequestMessage);
    var stringResponse = await response.Content.ReadAsStringAsync();

  } catch (Exception e) {
    Console.WriteLine(e);
    throw;
  }
}
}
 

Этот код работал два дня назад, но сегодня произошел сбой с ошибкой (другой разработчик также испытывает это) (ПРИМЕЧАНИЕ: vscode и этот код C# работают на одной машине):

System.Net.Http.HttpRequestException: Произошла ошибка при отправке запроса. —> System.Net.WebException: Базовое соединение было закрыто: При отправке произошла непредвиденная ошибка. —>> System.IO.IOException: Не удалось выполнить проверку подлинности, поскольку удаленная сторона закрыла транспортный поток. в System.Net.TlsStream.Завершите запись(IAsyncResult AsyncResult) в System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar) — Конец трассировки внутреннего стека исключений — в System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult AsyncResult, транспортный контекст и контекст) в системе.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar) — Конец трассировки внутреннего стека исключений — в System.Runtime.Исключительные услуги.ExceptionDispatchInfo.Бросьте() в System.Runtime.Услуги компиляторов.Дежурный.HandleNonSuccessAndDebuggerNotification(Задание задачи) в System.Runtime.Услуги компиляторов.TaskAwaiter`1.GetResult() в третьей части.WebAPI.Тесты.ServiceTest.d__1.MoveNext() в cccccccccccccccc :строка 128 — Конец трассировки стека из предыдущего местоположения, где было вызвано исключение — в System.Runtime.Исключительные услуги.ExceptionDispatchInfo.Бросьте() в Систему.Время выполнения.Услуги компиляторов.Дежурный.Обработчиконуспеха и удалениеобработка(Задача-задача) в Microsoft.VisualStudio.Тестовая платформа.MSTestAdapter.Услуги платформы.Потоковые операции.Выполните действия по обеспечению безопасности(Действие, действие)

System.Net.Http.HttpRequestException: Произошла ошибка при отправке запроса. —> System.Net.WebException: Базовое соединение было закрыто: При отправке произошла непредвиденная ошибка. —>> System.IO.IOException: Не удалось выполнить проверку подлинности, поскольку удаленная сторона закрыла транспортный поток. в System.Net.TlsStream.Завершите запись(IAsyncResult AsyncResult) в System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar) — Конец трассировки внутреннего стека исключений — в System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult AsyncResult, транспортный контекст и контекст) в системе.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar) — Конец трассировки внутреннего стека исключений — в System.Runtime.Исключительные услуги.ExceptionDispatchInfo.Бросьте() в System.Runtime.Услуги компиляторов.Дежурный.HandleNonSuccessAndDebuggerNotification(Задание задачи) в System.Runtime.Услуги компиляторов.TaskAwaiter`1.GetResult()

Комментарии:

1. Это может быть проблема с TLS, проверьте, какую версию TLS вы используете.

Ответ №1:

Возможно, вам потребуется применить версию TLS примерно так

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
 

Вы можете найти более подробную информацию о защитной защите здесь.