Система.Сеть.Http.Ошибка HttpRequestException при копировании содержимого в поток
Я использую С помощью HttpClient класс в .NET 4.5.2 framework. Я делаю PostAsync для стороннего веб-сервиса. 80% времени этот пост работает, 20% времени наш ответ сокращается. В этой ситуации мы получаем следующее исключение:
Система.Сеть.Http.HttpRequestException:ошибка при копировании содержимого в поток. ---> система.ИО.IOException: невозможно прочитать данные из транспортное соединение: существующее соединение принудительно закрыто удаленный хост. --Система ->.Чистая.Розетки.Исключения socketexception: существующий соединение было принудительно закрыто удаленным узлом в Системы.Чистая.Розетки.Объекте networkstream.Метод beginread(байт[] буфера, int32 и смещение, размер Int32, обратный вызов AsyncCallback, состояние объекта) - - - End внутренней трассировки стека исключений - - - at Системы.Чистая.Розетки.Объекте networkstream.Метод beginread(байт[] буфера, int32 и смещение, размер Int32, обратный вызов AsyncCallback, состояние объекта) в Система.Сеть.Исправлена ошибка.StartReading () at Система.Сеть.Безопасность._SslStream.StartFrameHeader (байт [] буфер, Int32 offset, int32 count, AsyncProtocolRequest asyncRequest) at Система.Сеть.Безопасность._SslStream.StartReading (байт [] буфер, Int32 offset, int32 count, AsyncProtocolRequest asyncRequest) at Система.Сеть.Безопасность._SslStream.ProcessRead (байт [] буфер, Int32 offset, int32 count, AsyncProtocolRequest asyncRequest) at Системы.Чистая.TlsStream.Метод beginread(байт[] буфера, int32 и смещение, int32 и размер, метод asynccallback метод asynccallback, параметр asyncstate объекта) в Система.Сеть.ConnectStream.Beginreadwithoutvalidation (байт [] буфер, Смещение Int32, размер Int32, обратный вызов AsyncCallback, состояние объекта) в Системы.Чистая.ConnectStream.Метод beginread(байт[] буфера, int32 и смещение, int32 и размер, обратный вызов AsyncCallback, состояние объекта) в Системы.Чистая.Протоколу HTTP.HttpClientHandler.WebExceptionWrapperStream.Метод Beginread(Байт[] буфер, типа int32 смещение, int32 и рассчитывать, объект asynccallback обратного вызова объекта государство) в системе.Сеть.Http.StreamToStreamCopy.StartRead ()
последующий идентичный запрос выполняется успешно. Это не запрос, который мы можем повторить, поскольку бизнес уже размещен. Это ставит нас в неловкое положение.
Это мой код:
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Authorization = authorizationHeader;
HttpContent httpContent = new StringContent(someXml);
//Exception occurs on next line...
var response = await httpClient.PostAsync("https://thirdpartyendpoint", httpContent);
var responseXml = await response.Content.ReadAsStringAsync();
//convert to Dto
}
сторонняя служба успешно сохраняет запись в свою базу данных и не видит никаких очевидных исключений в их конце. Они отметили, что неудачные запросы обычно занимают больше времени (вокруг 18-30 секунд) для записи в базу данных, чем успешных запросов.
Спасибо за помощь
1 ответов
мы решили эту проблему с 2 пересадками код:
-
утилизируйте httpResponseMessage и просто работайте с простым DTO
using (var httpResponseMessage = await httpClient.SendAsync(httpRequestMessage)) { return await CreateDto(httpResponseMessage); }
-
понизьте версию HTTP до v1.0
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri(url)) { Version = HttpVersion.Version10, Content = httpContent }; await client.SendAsync(httpRequestMessage);
, который имеет эффект добавления этого заголовка HTTP
Connection: close
, а не
Connection: keep-alive