2010-02-07 95 views
3

我们有一个.NET 3.5 Web应用程序,它使用第三方Web服务。该代理是通过向其wsdl添加Web引用而创建的。此代理未编译。.Net间歇性System.Web.Services.Protocols.SoapHeaderException

我们的错误日志正在回升,但频繁的间歇例外:

型“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下。不是很好。这可能与我们的情况很相似,但也可能适用于其他人。

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

+0

您能否提供例外的细节(即异常消息)? – 2010-02-07 15:48:43

+0

原来,大多数例外都是由于dns问题引起的......有时候这只是与编程无关! – ScottE 2010-03-06 00:23:02

+0

什么是DNS问题的解决方案?我们有类似的问题。谢谢! – 2010-05-07 16:46:02

回答

2

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

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

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

+0

看起来这确实是一个网络/路由器问题。一旦我们确认,我会发布任何结果。 – ScottE 2010-03-05 00:10:48

1

这个异常来自服务器端,通过SOAP头,你的客户端可能不会出错。您可能会从这些第三方网络服务提供商获得有关此错误的更多信息。

+0

这将是艰难的。到目前为止,他们还没有承认任何问题的责任。 – ScottE 2010-02-08 02:23:18

0

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

您是否将SOAP Headers传递给服务?然后看看是否有可能你做错了吗?也许你打算传递标题,但有时你不会?

+0

什么是传递给Web服务的最佳方式? Wireshark的? – ScottE 2010-02-08 02:24:07

+0

WireShark,提琴手等 – 2010-02-08 02:32:12

+1

为什么只有时候才能完全相同的请求呢?是否有任何地理/ ISP问题会导致这些请求被破坏? – ScottE 2010-02-09 22:09:48

0

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

它看起来像在Vendor.getSearch发生异常。此方法包含哪些代码?

+0

.getSearch是从第三方Web服务调用的方法。服务器端代码中没有错误 - 这是间歇性的。 – ScottE 2010-02-10 19:01:06

+0

它是间歇性的并不意味着没有服务器端错误。间歇性错误有时可以看到,因为事情正在改变(传递不同的数据或不同的用户等)。它可能与传入的不同数据有关。我需要更多信息才能帮助您。你发送什么服务? – 2010-02-11 03:58:47

+0

我在发送不同的搜索参数。我尝试过从生成错误的页面(其中包含查询字符串中的所有参数)并没有收到错误的链接。我只有一次能够得到一个错误屏幕,而且本身是间歇性的。我觉得这个问题与负载有关 - 特别是ws请求需要大约500毫秒才能回来。我认为线程正在被咀嚼 - 一个用于请求,另一个用于响应。不过,我不知道如何确认这一点。我想我正在寻找诊断问题的最佳方法。 – ScottE 2010-02-13 18:07:15

1

我们最近就遇到了这个与我们自己的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; 
    } 
} 
+0

我们将网页引用添加到普通网站项目中,因此我们没有要编辑的reference.cs/vb文件。我可以创建一个Web应用程序项目来获取访问权限,但是您知道另一种方式吗?感谢您的答案 - 我已经看到这是一个可能的原因。 – ScottE 2010-02-16 12:30:15

+0

如果你把它们放在VS中作为一个web引用,你可以扩展它来获得.cs文件,但是如果没有,你可以像我在响应中提到的那样子类化它。我将使用子类风格编辑响应。 – 2010-02-16 16:16:43

+0

谢谢,我会尽力去做的。 – ScottE 2010-02-16 18:02:36