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<ExceptionDetail> 出现,则不要循环整个会话...

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

一旦抛出非故障合同,即使 .State 属性顽固地报告通道处于打开状态,未来通过通道的调用也会引发“通道发生故障”错误。

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

4

1 回答 1

8

我相信您需要检查渠道的状态,而不是工厂。您可以通过将通道转换为 来做到这一点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;
}
于 2012-03-03T08:38:23.937 回答