2012-05-03 225 views
1

我正在使用MSMQ和WCF。現在,MSMQ可能會脫機,或者WCF與目標之間可能存在一些通信錯誤。 我知道我可以訂閱serviceHost上的Faulted事件,當MSMQ發生故障時,我確實收到了該事件 - 非常棒。 但是,怎樣才能知道發生的故障類型?我需要確定它是某種通信錯誤,如果是這樣,我想在一段時間後重新連接,並繼續嘗試,直到達到「幻數」。WCF故障 - 哪種故障?

服務中沒有拋出異常。只是當MSMQ離線時,WCF服務確實出現故障,但需要知道故障的類型。

感謝

+1

[在WCF中 - 在「Faulted」事件中 - 如何獲取異常詳細信息?](http://stackoverflow.com/questions/381345/in-wcf-in-the-faulted-event怎麼做,我得到例外的細節) –

+0

不是很基督教,但謝謝。這是針對MSMQ的,但我之前在MSDN上看到過IErrorHandler文檔,但是這是針對服務器端的,而不是客戶端。 –

回答

1

如果它不是異常的詳細信息,如基督教ķ表明,你正在尋找,而是爲什麼WCF服務/客戶端沒有收到其他通信異常,則原因是netMsmqBinding是實現「火&忘記」模式。

通過MSMQ管道,WCF服務與客戶端完全斷開連接,它只監聽MSMQ目標隊列上的消息。使用netMsmqBinding的服務操作必須配置爲單向(返回void),因爲一旦WCF客戶端成功將消息放入MSMQ傳出隊列中,其工作就完成了。假設是MSMQ提供了保證消息傳遞給WCF服務。 MSMQ 4.0將處理您對「重新連接」和「幻數重試」的擔憂。

+0

謝謝。我正在使用MSMQIntegratedBinding,而不是它有很大的不同。我明白了火,忘了。但我確實知道,當目標上的MSMQ處於脫機狀態(訂閱了serviceHost類的OnFaulted事件)時,該服務可能會出現故障。所以我知道它的故障,但我需要知道它的故障原因的例外或原因的類型,所以我可以做我自己的內部重試,嘗試重新連接到離線的羣集MSMQ,否則服務將無法接收那些來自MSMQ隊列的消息,除非您手動重新啓動它。 –

+0

羣集MSMQ可以挑剔。我的客戶使用它,但我沒有參與設置它。根據我們的經驗,一旦消息被MSMQ接受並放置在發起客戶端機器的傳出隊列中,它就永遠不會「丟失」。當某些服務器被定期關閉並且默認的生存時間段用盡時,我們在開發中遇到了問題,因此將消息轉移到客戶端計算機上的系統死信隊列中。我不太明白想要重新嘗試/重新連接的需要。 –

+0

這是因爲在羣集環境中,如果關閉其中一個節點,則羣集MSMQ傳播到另一個節點,這會斷開WCF客戶端(成爲故障)。因此連接的客戶端將失去連接並且不會接收消息,而是將消息放入隊列中,直到您重新啓動WCF應用程序爲止。這就是爲什麼我想知道什麼時候應用程序出現故障,並知道它是什麼樣的錯誤 –