.Net Intermittent System.Web.Services.Protocols.SoapHeaderException

时间:2010-02-07 14:59:01

标签: .net web-services asmx

我们有一个使用第三方网络服务的.net 3.5网络应用程序。通过向wsdl添加Web引用来创建代理。此代理未编译。

我们的错误记录正在频繁但间歇性的异常:

发生并捕获了'System.Web.Services.Protocols.SoapHeaderException'类型的异常

如果我按照网址跟踪生成异常的页面,我就无法重新创建它。

编辑:以下是大多数例外情况 - 它从

冒出来
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支持,他们查看了一些跟踪和网络捕获。 Web服务主机执行循环DNS,它们可能正在响应来自一个ip的syn syn / ack的不同IP地址,以及来自不同ip的下一个IP地址。这个不好。这可能与我们的情况非常相关,但也许它也适用于其他人。

Microsoft网络监视器和应用程序跟踪为我们提供了所需的信息。

5 个答案:

答案 0 :(得分:2)

这样做的原因是,当从服务器读取响应的开头(响应开始时的SOAP标头)时,服务器而不是发送SOAP响应,关闭了TCP / IP连接。

显然,错误不在客户端。它很可能是服务器过载的情况,它不是提供响应或500或503 HTTP错误代码,而是简单地终止TCP / IP连接。某些网络设备导致这些连接丢失的概率很小(但很小),但我自然会先开始调查服务器端。

我建议使用像Fiddler或Wireshark这样的工具来记录其中一个错误。由于它是强制TCP / IP连接关闭,我会寻找与服务器的通信,该服务器以强制连接关闭的TCP RST数据包结束。

答案 1 :(得分:1)

此异常来自服务器端通过SOAP标头,您的客户端可能没有错。您可能会从这些第三方Web服务提供商那里获得有关此错误的更多信息。

答案 2 :(得分:1)

我们最近使用自己的网络服务遇到了这个问题,最终导致超时问题。 Web服务的实际超时设置得足够高并且永远不会受到影响,但它抛出了这个异常,因为它没有提供任何更新来保持活动(非抽水)。这是我们的解决方案,希望它有所帮助。您可以将Web服务子类化或直接放入reference.cs文件中,但在更新Web引用时会被覆盖。

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;
    }
}

答案 3 :(得分:0)

假设服务器工作正常,它在故障中包含Client代码的事实表明服务器认为客户端有问题。

您是否将SOAP标头传递给服务?然后看看你是否有可能做错了?也许你的意思是传递标题,但有时你却没有?

答案 4 :(得分:0)

您看到的异常可能是由服务器端代码中的错误引起的。

看起来Vendor.getSearch发生了异常。该方法包含哪些代码?