2012-03-02 53 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