Я вызываю PostAsync для стороннего веб-сервиса. В 80% случаев этот пост работает, в 20% случаев наш ответ прерывается. В этой ситуации мы получаем следующее исключение:
System.Net.Http.HttpRequestException: Ошибка при копировании содержимого в
поток. ---> System.IO.IOException: невозможно прочитать данные из
транспортного соединения: существующее соединение было принудительно закрыто
удаленным хостом. ---> System.Net.Sockets.SocketException: существующее
соединение было принудительно закрыто удаленным хостом в
System.Net.Sockets.NetworkStream.BeginRead(буфер Byte[], Int32
смещение, размер Int32, обратный вызов AsyncCallback, состояние объекта) --- Конец
трассировки внутреннего стека исключений --- в
System.Net.Sockets.NetworkStream.BeginRead(Byte[] buffer, Int32смещение, размер Int32, обратный вызов AsyncCallback, состояние объекта) в
System.Net.FixedSizeReader.StartReading() в
System.Net.Security._SslStream.StartFrameHeader(Byte[] буфер, Int32offset, Int32 count, AsyncProtocolRequest asyncRequest) at
System.Net.Security._SslStream.StartReading(Byte[] buffer, Int32
offset, Int32 count, AsyncProtocolRequest asyncRequest) at
System .Net.Security._SslStream.ProcessRead(буфер Byte[], смещение Int32
, счетчик Int32, AsyncProtocolRequest asyncRequest) в
System.Net.TlsStream.BeginRead(буфер Byte[], смещение Int32, Int32size, AsyncCallback asyncCallback, Object asyncState) в
System.Net.ConnectStream.BeginReadWithoutValidation(буфер Byte[],
смещение Int32, размер Int32, обратный вызов AsyncCallback, состояние объекта) в
System.Net.ConnectStream.BeginRead(буфер Byte[], смещение Int32, размер Int32
, обратный вызов AsyncCallback, состояние объекта) в
System.Net.Http.HttpClientHandler.WebExceptionWrapperStream.BeginRead(Byte[]буфер, смещение Int32, счетчик Int32, обратный вызов AsyncCallback, состояние объекта
) в System.Net.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
}
Что я могу сделать, чтобы лучше справиться с этим?
Подробнее здесь: https://stackoverflow.com/questions/332 ... o-a-stream