我正在使用ChannelFactory打开/管理WCF频道(与客户端代理相对)。但是,当发生异常时,工厂状态不报告通道出现故障......
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();
我原以为工厂状态会在catch(...)块中返回CommunicationState.Faulted。
最后,我正在寻找一种在使用ChannelFactory与ClientProxy时准确获取通道状态的方法因为我想尽可能保留会话状态;如果合法的FaultContact&lt; ExceptionDetail&gt;并且不循环整个会话。来了......
当一个合法的FaultContact&lt; ExceptionDetail&gt;提出,频道仍然有效&amp;我可以按预期继续使用它。但是当一个非FaultContract&lt; ExceptionDetail&gt;升起,通道不可用,应该循环。但是,在这两种情况下,.State属性都返回CommunicationState.Open,因此没有一种很好的方法来判断通道是否应该循环...
一旦抛出非FaultContract,即使.State属性固执地报告该通道处于Opened状态,通过该通道的未来调用也会引发“通道出现故障”错误。
提前感谢任何输入/想法/指示/想法,
Ť
答案 0 :(得分: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;
}