2012-03-02 44 views
3

我正在使用ChannelFactory來打開/管理WCF頻道(與客戶端代理)。然而,當發生異常時,出廠狀態不報告,該通道出現故障......WCF ChannelFactory不能準確報告故障狀態?

 ChannelFactory<IContract> factory 
        = new ChannelFactory<IContract>("NetTcpBinding_IContract", 
                new EndpointAddress("net.tcp://localhost:8509/WCFSvc")); 

     try 
     { 
      IContract contrct = factory.CreateChannel(); 
      contrct.DoWork(); //throws a non-FaultContract<ExceptionDetail>() exception 
      factory.Close(); 
     } 
     catch (Exception) 
     { 
      CommunicationState s = factory.State; //returns CommunicationState.Opened 
     } 

凡IContract.DoWork()看起來像:

[FaultContract(typeof(ExceptionDetail))] 
    void DoWork(); 

我本來預期工廠狀態返回了CommunicationState.Faulted在catch(...)塊中。

最後,我正在尋找一種方法來準確地獲取使用ChannelFactory與ClientProxy時的通道狀態,因爲如果可能,我想保留會話狀態;而不是循環當一個合法的FaultContact <ExceptionDetail>,那麼就會拋出一個合法的FaultContact <ExceptionDetail>來貫穿整個會議...

,通道仍然有效&我可以繼續使用它作爲預期。但是當引發非FaultContract <ExceptionDetail>時,通道不可用並應循環。但是,在這兩種情況下,.State屬性都返回CommunicationState.Open,因此沒有很好的方法來判斷通道是否應該循環或不...

一旦引發了非FaultContract,該頻道即使在.State屬性固執地報告頻道處於打開狀態時,也會引發「頻道故障」錯誤。

預先感謝任何輸入/想法/指針/想法,

牛逼

+0

究竟你的意思,在非FaultContract「不」? – 2012-03-02 22:32:14

+0

意味着DoWork拋出一個不是FaultContract ()的異常(例如拋出ApplicationException) – TOB 2012-03-04 12:53:43

回答

6

我相信你需要檢查通道,而不是工廠的狀態。您可以通過將頻道投射到ICommunicationObject來實現此目的,該頻道在頻道和工廠中均已實施。

事情是這樣的:

ChannelFactory<IContract> factory 
       = new ChannelFactory<IContract>("NetTcpBinding_IContract", 
               new EndpointAddress("net.tcp://localhost:8509/WCFSvc")); 

IContract contrct; 

try 
{ 
    contrct = factory.CreateChannel(); 
    contrct.DoWork(); //throws a non-FaultContract<ExceptionDetail>() exception 
    factory.Close(); 
} 
catch (Exception) 
{ 
    //CommunicationState s = factory.State; //returns CommunicationState.Opened 
    CommunicationState s = ((ICommunicationObject)contrct).State; 
} 
+0

完美無缺 - 希望它是這樣直截了當的東西! – TOB 2012-03-03 14:15:04