2009-11-27 54 views

回答

2

我想,因爲我不知道你說的是哪一個分割的例外在下列2種類型:

WCF通信異常:
這些異常可能不會麻煩你的服務器端應用程序。所以你不必擔心它們。您只需在客戶端應用程序中小心。

應用程序異常:
(顯然)你需要抓住他們,否則你的服務器端應用程序會崩潰。

2

是的,你應該 - 無論如何!

首先,服務器端的未捕獲的異常將「錯誤」通道,例如,將客戶端和服務器之間的通道置於「恐慌模式」 - 不再有可能的呼叫,您需要關閉(或中止)來自客戶端的通道並重新建立連接。其次,當然,未處理的異常會使服務器代碼崩潰 - 但是,默認情況下,您的WCF調用應該是「每次調用」,也就是說,每次請求都會得到一個全新的,新鮮的實例化你的服務器類的對象,並且在調用結束時,它將被拋棄。所以這真的不是那麼糟糕...

在WCF中有一個名爲IErrorHandler的接口,您可以在服務器端實現接口。它提供的是捕捉任何異常的能力,並將它們變成「可互操作的」SOAP錯誤,這些錯誤將通過通信通道發回,而不會導致它進入恐慌模式。

有幾個IErrorHandler實現那裏基本上允許您動態地插入作爲服務行爲 - 無論是在服務器的配置,或在您的服務類代碼作爲屬性。查看this blog post這些樣本之一(還有更多 - 只是谷歌爲他們)。

+0

@marc_s:我寫了一個使用WCF的客戶端 - 服務器應用程序,它在過去六個月的生產中(沒有停機時間)。我沒有在服務器中編寫一行代碼來捕獲** WCF通信異常**。但是,我確實使用了每次通話模式,並且我很想知道如果我將其更改爲「每會話」或「單身人士」模式,我將不得不在服務器中進行更改... – Hemant 2009-11-27 10:14:40

+0

雖然從我閱讀的任何時間(我在學習WCF的時候),只有「per-call」是有道理的。 – Hemant 2009-11-27 10:16:34

0

預期有例外例外;最好是將它們冒泡爲故障(WCF術語 - 查找FaultException),但無論哪種方式,該異常都會簡單地轉換到網絡上並由客戶端處理。 WCF客戶端真的不喜歡得到異常,這通常是一個代理終端(客戶端應該清理他們現有的代理並啓動一個新的會話來獲得新的會話等)。但是你的服務器進程(減去borked會話)將繼續運行並提供服務請求。

當然也有非常討厭和服務器發生嚴重異常的一個類別 - 堆棧溢出,內存,線程中止等,但沒有太多可以做那些反正