ChannelFactory.Open VS IClientChannel.Open

Tre*_*mbs 7 .net c# wcf wcf-client

我试图更好地理解WCF的一些内部工作原理.我已经做了相当多的环顾四周,但是我无法找到ChannelFactory.Open()与之相比的明确解释IClientChannel.Open().开工厂的目的是什么?如果正在使用该通道进行通信,那么在创建和打开通道后,工厂将在该过程中播放哪个部分?

有人问在这里,其他的问题之一,但从来没有直接回答.

编辑:

在对源代码进行反编译之后,我发现了需要在ChannelFactory上调用Open的一些具体原因,如下所述.

我仍然无法理解的是,为什么这项工作是通过ICommunicationObject提供的机制完成的,当工厂实际上没有与任何东西进行通信时(据我所知).为什么不在构造或处理对象时处理这些事情?

我想我可能已经远远不够杂草,这样的答案可能无法公开.感谢那些权衡原始问题的人.

Cyb*_*axs 6

Open需要在工厂中调用,因为它是ICommunicationObject - 在使用其中之一之前,需要打开它.但在大多数情况下,当您调用CreateChannel之类的东西时,工厂会自动打开,因此您很少需要担心明确打开工厂.

关于Close,它实际上取决于工厂使用的绑定.在大多数情况下,您是正确的,资源主要与渠道相关联.但是某个绑定可能会在同一个底层连接中复用多个通道,因此关闭通道只会从列表中删除要多路复用的通道.只有当工厂关闭时才会实际发布基础连接.


Tre*_*mbs 1

在反编译了一堆相关的类之后System.ServiceModel,我获得了更多的信息。

Open调用似乎沿着继承树向下到达 CommunicationObject,并在此处Open调用其方法。所有这一切似乎都是提供一堆诊断信息并引发一些事件。

该类ChannelFactory使用 Open 事件执行许多操作,包括创建其内部通道工厂:

protected override void OnOpening()
{
    base.OnOpening();
    this.innerFactory = this.CreateFactory();
    if (this.innerFactory == null)
    {
        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString("InnerChannelFactoryWasNotSet")));
    }
}
Run Code Online (Sandbox Code Playgroud)

正如其他人在这里提到的,关闭事件还用于执行诸如关闭所有底层通道之类的操作(通过其内部通道工厂):

protected override void OnClose(TimeSpan timeout)
{
    TimeoutHelper timeoutHelper = new TimeoutHelper(timeout);
    while (true)
    {
        IChannel channel;
        lock (base.ThisLock)
        {
            if (this.channelsList.Count == 0)
            {
                break;
            }
            channel = this.channelsList[0];
        }
        channel.Close(timeoutHelper.RemainingTime());
    }
}
Run Code Online (Sandbox Code Playgroud)