2012-08-08 89 views
3

我託管WCF作爲Widnows服務,但我有處理WCF通道Faulted狀態的問題。 ServiceHost上的故障事件從未升起。如何處理WCF上的故障狀態? (託管在Windows服務)

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)] 
public class Service1 : IService1 
{ 
    public string GetFault() 
    { 
     throw new Exception("Should went to fault.."); 
    } 

是否正確地使用它,我:

託管應用程序:

protected override void OnStart(string[] args) 
    { 
     _serviceHost = new ServiceHost(typeof(WCF_FaultTest.Service1)); 
     _serviceHost.Faulted += _serviceHost_Faulted; 
     _serviceHost.Open(); 
    } 

    void _serviceHost_Faulted(object sender, EventArgs e) 
    { 
     // never raise up.. 
    } 

故障狀態我試着模仿這樣嗎?謝謝。

+0

謝謝,但我已經嘗試過(實際執行)。自定義IErrorHandler問題保持不變。每個異常在HandleError中都是正確處理的,但是ServiceHost上的Faulted事件仍然不會引發。(我想中止並在故障時重新創建ServiceHost) – Chatumbabub 2012-08-08 17:52:37

回答

5

您正在使用多個CommunicationObject。當您在服務實現中拋出異常時,通道出現故障,但主機不是。 在這種情況下,ServiceHost.Faulted事件不適用。

要記住的一件事是,一旦CommunicationObject進入故障狀態,就不能再使用它了。對發生故障的CommunicationObject唯一要做的就是關閉/中止。在您的服務拋出異常之後,如果您創建了新頻道,您仍然可以調用該服務。所以這個服務沒有錯。

從架構的角度來看,服務主機事件並不是實現錯誤處理的「正確」位置。一般而言,您希望將錯誤處理作爲服務配置的一部分。例如,ServiceHost事件中的錯誤處理不易移動到IIS託管。您的評論聽起來像IErrorHandler不符合您的要求。你想要實現什麼要求?

+0

Ernie,我的問題是我不知道CommunicationObject何時進入故障狀態。 在我腦海中,我在想,在ServiceHost.Faulted事件中可以這樣做: _serviceHost.Abort(); _serviceHost = new ServiceHost(typeof(WCF_FaultTest.Service1)); _serviceHost.Open(); – Chatumbabub 2012-08-08 19:38:12

+0

以我的觀點來看,IErrorHandler是記錄異常的好地方,等等。但是我想在通道進入故障狀態時「檢測」,然後我想調用Abort()打開一個新的WCF服務實例。 – Chatumbabub 2012-08-08 19:56:55

+1

您正在嘗試解決不是問題的問題。當通道出現故障時,客戶端應該打開一個新通道。但是當通道出現故障時,服務主機不受影響,應該什麼也不做。 – ErnieL 2012-08-08 20:00:59