2010-10-21 53 views
3
CommunicationException was unhandled by user code 
The socket connection was aborted. This could be caused by an error processing your message 
or a receive timeout being exceeded by the remote host, or an underlying network resource 
issue. Local socket timeout was '02:48:04.9840000'. 

我一直在測試這個應用程序幾個月,剛剛看到這個錯誤後,對其中一個服務做了一些小改動。這只是幾秒鐘,所以我不認爲這是一個超時問題。WCF:套接字連接被中止

的InnerException信息:System.IO.IOException:讀操作失敗,請參見內部異常

(內)的InnerException:System.Net.Sockets.SocketException - 一個現有的連接被強行關閉遠程主機。

任何建議,非常感謝!

在此先感謝

+0

我建議你調查爲什麼遠程主機關閉連接。 – 2010-10-21 18:39:09

+1

那麼,當我通過它調試時,一切似乎都很好,但從管理器返回到代理(客戶端)時,會引發異常。我想說更多的數據是通過允許的,但沒有比通常更多 – 2010-10-21 18:42:25

+0

你試過WCF跟蹤? – 2010-10-21 20:00:01

回答

4

您很可能遇到配額問題,如綁定中定義的MaxReceivedMessageSize,MaxArrayLength,MaxStringContentLength。

您還可以查看行爲中可用的MaxItemsInObjectGraph屬性。

8

通常我看到這個錯誤,當對方不乾淨地關閉連接。如果在客戶端有一個繼承自ClientBase<T>的類,那麼當您完成服務時(實際上ClientBase<T>實現了IDisposable,因此您可以使用using語句),應該調用Close

如果您使用ChannelFactory<T>創建到服務的連接,則結果是實現合同的代理,但也實現ICommunicationObject;當你完成後,你應該打電話給Close

在服務端事情是不一樣的,會話(因此底層套接字)由客戶端管理。如果該服務最有可能丟失套接字,這是錯誤的結果,在這種情況下,Music Magi的建議是一個很好的建議。微軟談到如何去做這個here

請注意,要清楚瞭解發生了什麼,您可能必須爲客戶端和服務設置跟蹤。爲了查看跟蹤,您應該使用SvcTraceViewer,這應該在Program Files\Microsoft SDKs\Windows\v6.0A\binProgram Files\Microsoft SDKs\Windows\v7.0A\bin文件夾中。如果您必須同時跟蹤客戶端和服務,則可以使用File/Add菜單在SvcTraceViewer中一起打開這兩個文件。

3

我遇到了一些套接字連接因爲不同的原因而中止,我覺得這是值得回答的。

除了不能在你的MaxReceivedMessageSize,的MaxArrayLength,MaxStringContentLength有足夠高的值,如MaxItemsInObjectGraph約翰指出...

檢查,以確保你與WCF序列化很好發揮的類型。例如,我遇到了同樣的問題,但後來發現我通過導致服務中止的線路發送了System.DBNull。一旦我過濾了DBNull對象,事情又開始發揮作用。