WCF ChannelFactory无法准确报告故障状态?

TOB*_*TOB 3 wcf channelfactory

我正在使用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
        }
Run Code Online (Sandbox Code Playgroud)

IContract.DoWork()的位置如下:

    [FaultContract(typeof(ExceptionDetail))]
    void DoWork();
Run Code Online (Sandbox Code Playgroud)

我原以为工厂状态会在catch(...)块中返回CommunicationState.Faulted.

最后,我正在寻找一种方法来准确获取通道状态时使用ChannelFactory与ClientProxy cuz我想尽可能保留会话状态; 如果合法的FaultContact <ExceptionDetail>通过,则不循环整个会话...

当引发合法的FaultContact <ExceptionDetail>时,该通道仍然有效,我可以继续按预期使用它.但是,当引发非FaultContract <ExceptionDetail>时,该通道不可用,应该循环.但是,在这两种情况下,.State属性都返回CommunicationState.Open,因此没有一种很好的方法来判断通道是否应该循环...

一旦抛出非FaultContract,即使.State属性固执地报告该通道处于Opened状态,通过该通道的未来调用也会引发"通道出现故障"错误.

提前感谢任何输入/想法/指针/想法,

Ť

Tim*_*Tim 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;
}
Run Code Online (Sandbox Code Playgroud)