【问题标题】:.Net Intermittent System.Web.Services.Protocols.SoapHeaderException.Net 间歇性 System.Web.Services.Protocols.SoapHeaderException
【发布时间】:2010-02-07 14:59:01
【问题描述】:

我们有一个使用第三方网络服务的 .net 3.5 网络应用程序。代理是通过向其 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)

更新

我们仍在努力。原来是路由问题,解决了。我们仍然收到带有套接字错误的内部异常。我们今天有 MS 支持,他们查看了一些跟踪和网络捕获。 Web 服务主机执行循环 DNS,它们可能会响应来自一个 ip 的 syn syn/ack 的不同 IP 地址,以及来自不同 ip 的下一个 IP 地址。不是很好。这可能非常适合我们的情况,但也可能适用于其他人。

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

【问题讨论】:

  • 能否提供异常的详细信息(即异常消息)?
  • 事实证明,大多数异常都是由于 dns 问题造成的……有时只是与编程无关!
  • DNS 问题的解决方案是什么?我们也有类似的问题。谢谢!
  • @Brian - 我在上面添加了更新。

标签: .net web-services asmx


【解决方案1】:

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

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

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

【讨论】:

  • 看起来这确实是网络/路由器问题。一旦我们验证,我会发布任何结果。
【解决方案2】:

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

【讨论】:

  • 这将是艰难的。到目前为止,他们尚未承认对任何问题负责。
【解决方案3】:

我们最近在使用自己的 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;
    }
}

【讨论】:

  • 我们将 Web 引用添加到一个普通的网站项目中,因此我们没有要编辑的 reference.cs / vb 文件。我可以为 Web 引用创建一个 Web 应用程序项目来访问它,但是您知道另一种方法吗?感谢您的回答 - 我认为这是一个可能的原因。
  • 如果您在 VS 中将它们作为 Web 参考,您可以将其展开以获取 .cs 文件,但如果没有,您可以像我在回复中提到的那样对其进行子类化。我将使用子类样式编辑响应。
【解决方案4】:

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

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

【讨论】:

  • 为什么完全相同的请求有时会起作用?是否有任何地理/ISP 问题会导致这些请求被破坏?
  • @ScottE:您必须询问服务器为什么它有时会工作,有时会失败 - 是服务器返回故障。也许服务器正在抛硬币?可能不是,但这说明问题可能完全在服务器内部,并且在不“询问”服务有什么问题的情况下完全不可见。
  • @John,在我的情况下会出现哪些问题? httpKeepAlives?线程被网络请求/响应吃掉了?我从哪里开始?
  • @ScottE:从服务器计算机上的 Windows 事件日志开始。如果它是 WCF 服务,则打开跟踪。这是“正常”调试情况(在服务器上)。您必须寻找错误发生时发生的任何异常情况。
  • 对不起,约翰,但这个答案真的没有帮助。
【解决方案5】:

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

看起来异常发生在Vendor.getSearch。这个方法包含什么代码?

【讨论】:

  • .getSearch 是从第 3 方 Web 服务调用的方法。服务器端代码中没有错误 - 这是间歇性的。
  • 间歇性不代表没有服务器端错误。有时会看到间歇性错误,因为事情正在发生变化(传递不同的数据或不同的用户等)。这可能与传入的不同数据有关。我需要更多信息来帮助您。您要向服务发送什么?
  • 我正在发送不同的搜索参数。我已经尝试跟踪生成错误的页面中的链接(其中包含查询字符串中的所有参数)并且没有收到错误。我只有一次能够获得错误屏幕,而这本身就是间歇性的。我觉得这个问题与负载有关——特别是 ws 请求需要大约 500 毫秒才能返回。我认为线程正在被咀嚼 - 一个用于请求,一个用于响应。但是,我不知道如何确认这一点。我想我正在寻找诊断问题的最佳方法。
  • 看起来确实是服务器问题。最好的诊断方法是得到服务器的配合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2018-09-22
  • 1970-01-01
  • 2021-07-15
  • 2012-10-20
  • 2018-12-16
  • 2019-01-18
相关资源
最近更新 更多