WCF 通道工厂未准确报告故障状态



我正在使用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 时,该通道不可用,应循环使用。但是,在这两种情况下,.状态属性正在返回 CommunicationState.Open,因此没有一种很好的方法来判断是否应该循环通道......

一旦抛出非故障协定,将来通过通道的调用会引发"通道出现故障"错误,即使 .状态属性顽固地报告通道处于"已打开"状态。

提前感谢您的任何输入/想法/指示/想法,

T

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

最新更新