2010-02-07 207 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