Система.Сеть.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 пересадками код:

  1. утилизируйте httpResponseMessage и просто работайте с простым DTO

     using (var httpResponseMessage = await httpClient.SendAsync(httpRequestMessage))
        {
            return await CreateDto(httpResponseMessage);
        }
    
  2. понизьте версию 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