代码之家  ›  专栏  ›  技术社区  ›  ScottE

.NET间歇性System.Web.Services.Protocols.SoapHeaderException

  •  3
  • ScottE  · 技术社区  · 14 年前

    我们有一个.NET 3.5 Web应用程序,它使用第三方Web服务。代理是通过向其WSDL添加Web引用而创建的。未编译此代理。

    我们的错误日志记录收集了频繁但间歇性的异常:

    “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)
    

    更新

    我们还在努力。最初有一个路由问题,解决了。我们仍然得到了套接字错误的内部异常。今天我们有微软的支持,他们查看了一些跟踪和网络捕获。Web服务主机执行循环DNS,它们可能在一个IP的syn-syn/ack的另一个IP地址上响应,另一个IP的syn/ack的另一个IP地址上响应。这不好。这很可能是针对我们的情况,但也可能适用于其他人。

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

    5 回复  |  直到 14 年前
        1
  •  2
  •   qbeuek    14 年前

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

    显然,错误不在客户端。很可能是 服务器过载 在不提供响应或500或503 HTTP错误代码的情况下,它只是终止TCP/IP连接。有些网络设备导致这些连接中断的可能性很小,但我自然会先研究服务器端。

    我建议使用诸如fiddler或wireshark之类的工具来记录其中一个错误。因为它是强制关闭的TCP/IP连接,所以我将查找与以强制关闭连接的TCP RST数据包结尾的服务器的通信。

        2
  •  1
  •   Pent Ploompuu    14 年前

    这个异常是通过SOAP头从服务器端发出的,您的客户机在这里可能没有故障。您可以从第三方Web服务提供商处获得有关此错误的更多信息。

        3
  •  1
  •   Patrick Kafka    14 年前

    我们最近在自己的Web服务中遇到了这个问题,它最终成为一个超时问题。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;
        }
    }
    
        4
  •  0
  •   John Saunders    14 年前

    假设服务器正常工作,它包括 Client 故障中的代码表示服务器认为客户端有故障。

    您正在将SOAP头传递给服务吗?然后看看是否有可能你做的不对?也许你是想传头球,但有时你不传?

        5
  •  0
  •   Gabriel McAdams    14 年前

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

    异常似乎发生在 Vendor.getSearch . 这个方法包含什么代码?