.Net Прерывистая система.Web.Services.Protocols.SoapHeaderException - PullRequest
3 голосов
/ 07 февраля 2010

У нас есть веб-приложение .net 3.5, которое использует сторонние веб-сервисы. Прокси был создан путем добавления веб-ссылки на их wsdl. Этот прокси не скомпилирован.

В нашем журнале ошибок выявляются частые, но периодически возникающие исключения:

Возникла исключительная ситуация типа 'System.Web.Services.Protocols.SoapHeaderException'

Если я следую за URL-адресом страницы, сгенерировавшей исключение, я не могу создать его заново.

Редактировать: Вот большая часть исключения - там, где оно всплыло с

Message : Internal Error
Type : System.Web.Services.Protocols.SoapHeaderException, System.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a Source : System.Web.Services Help link : 
Actor : 
Code : http://schemas.xmlsoap.org/soap/envelope/:Client
Detail : 
Lang : 
Node : 
Role : 
SubCode : 
Data : System.Collections.ListDictionaryInternal
TargetSite : System.Object[] ReadResponse(System.Web.Services.Protocols.SoapClientMessage, System.Net.WebResponse, System.IO.Stream, Boolean)
Stack Trace :    at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at Vendor.getSearch(getSearchRequest getSearchRequest) in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\be43c34e\b09edc7e\App_WebReferences.pww-cf-q.0.cs:line 73

Редактировать 2: Внутренние исключения:

Иногда я регистрирую следующие внутренние исключения:

Message : Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
    Type : System.IO.IOException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
    Source : System
    Help link : 
    Data : System.Collections.ListDictionaryInternal
    TargetSite : Int32 Read(Byte[], Int32, Int32)
    Stack Trace :    at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
       at System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)
       at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
       at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
       at System.Net.TlsStream.CallProcessAuthentication(Object state)
       at System.Threading.ExecutionContext.runTryCode(Object userData)
       at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
       at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
       at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
       at System.Net.ConnectStream.WriteHeaders(Boolean async)

И / Или:

Message : An existing connection was forcibly closed by the remote host
        Type : System.Net.Sockets.SocketException, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
        Source : System
        Help link : 
        ErrorCode : 10054
        SocketErrorCode : ConnectionReset
        NativeErrorCode : 10054
        Data : System.Collections.ListDictionaryInternal
        TargetSite : Int32 Receive(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags)
        Stack Trace :    at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
           at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)

Обновление

Мы все еще работаем над этим. Первоначально была проблема маршрута, которая была решена. Мы все еще получаем внутреннее исключение с ошибками сокета. Сегодня у нас была поддержка MS, и они рассмотрели некоторые следы и захваты сети. Хост веб-службы выполняет циклический перебор DNS, и он может отвечать на другой IP-адрес для syn syn / ack с одного ip, а следующий - с другого ip. Это не хорошо. Вероятно, это довольно специфично для нашей ситуации, но, возможно, это относится и к другим.

Microsoft Network Monitor и трассировка приложений получили нам необходимую информацию.

Ответы [ 5 ]

2 голосов
/ 16 февраля 2010

Причина этого заключается в том, что при чтении начала ответа от сервера (заголовки SOAP, которые находятся в начале ответа) сервер вместо отправки ответа SOAP закрыл соединение TCP / IP.

Очевидно, что ошибка не на стороне клиента.Скорее всего, это перегрузка сервера , когда вместо отправки ответа или кода ошибки 500 или 503 он просто завершает соединение TCP / IP.Существует (очень малая) вероятность того, что какое-то сетевое оборудование вызывает такие потери соединения, но я, естественно, сначала начал бы исследовать сторону сервера.

Я рекомендую использовать такой инструмент, как Fiddler или Wireshark, чтобы зарегистрировать одну из этих ошибок,Поскольку это принудительное закрытие соединения TCP / IP, я бы искал соединения с сервером, который заканчивается TCP RST-пакетом, который принудительно закрывает соединение.

1 голос
/ 16 февраля 2010

Мы недавно столкнулись с этим с нашими собственными веб-сервисами, и это закончилось проблемой тайм-аута. Фактический тайм-аут веб-службы был установлен достаточно высоким и никогда не получал удар, но он выдавал это исключение, потому что он не давал никаких обновлений, чтобы остаться в живых (не качая). Это было решением для нас, надеюсь, это поможет. Вы можете создать подкласс своего веб-сервиса или поместить его прямо в файл reference.cs, но он будет перезаписан при обновлении веб-ссылок.

public partial class TheWebServiceSubClass : TheWebService
{
    protected override WebRequest GetWebRequest(Uri uri)
    {
        HttpWebRequest webRequest = (HttpWebRequest) base.GetWebRequest(uri);

        webRequest.KeepAlive = false;
        webRequest.ProtocolVersion=HttpVersion.Version10;
        return webRequest;
    }
}
1 голос
/ 08 февраля 2010

Это исключение происходит со стороны сервера через заголовки SOAP, и ваш клиент, вероятно, здесь не виноват. Вы можете получить дополнительную информацию об этой ошибке от сторонних поставщиков веб-услуг.

0 голосов
/ 10 февраля 2010

Исключения, которые вы видите, могут быть вызваны ошибками в коде на стороне сервера.

Похоже, исключение произошло в Vendor.getSearch. Какой код содержит этот метод?

0 голосов
/ 08 февраля 2010

Предполагая, что сервер работает нормально, тот факт, что он включил в ошибку код Client, указывает на то, что сервер считает, что клиент виноват.

Передаете ли вы SOAP-заголовки в службу? Тогда посмотрите, возможно ли, что вы делаете это неправильно? Возможно, вы должны передавать заголовки, но иногда нет?

...