WCF ChannelFactory不能准确报告故障状态?

3

我正在使用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通过,不要循环整个会话...
当出现真正的 FaultContact时,通道仍然有效,我可以按预期继续使用它。但是,当引发非 FaultContract 时,通道无法使用,应该进行循环。但是,在这两种情况下,.State 属性都返回 CommunicationState.Open,因此没有很好的方法告诉通道是否应该被循环...
一旦引发非 FaultContract,即使 .State 属性固执地报告通道处于已打开状态,将来通过通道进行的调用也会引发“通道已故障”的错误。
谢谢提前任何输入/想法/指针/思路,T

“non-”在“non-FaultContract”中的确切含义是什么? - H H
这意味着DoWork抛出的异常不是FaultContract<ExecptionDetails>()(例如抛出ApplicationException)。 - TOB
1个回答

9

我认为您需要检查通道的状态,而不是工厂。您可以通过将通道强制转换为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;
}

完全有道理——希望它像那样直截了当! - TOB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接