ChannelFactory.Open与IClientChannel.Open的区别

7
我正在努力更好地理解WCF的一些内部工作原理。我已经搜索了相当多的内容,但是我没有找到一个清晰的解释,说明ChannelFactory.Open()IClientChannel.Open()有什么区别。打开工厂的目的是什么?如果通道用于通信,那么在通道创建和打开之后,工厂在这个过程中扮演什么角色?
这个问题被问到了这里,但从未得到直接回答。
编辑:
通过反编译源代码,我发现了一些需要在ChannelFactory上调用Open的具体原因,下面有文档记录。
我仍然很难理解为什么这些工作是通过ICommunicationObject提供的机制来完成的,当工厂实际上并没有与任何东西进行通信(据我所知)。为什么不在对象构造或销毁时处理这些事情?
我想我可能已经深入到无法公开获得这样的答案的境地了。感谢那些对原始问题进行了权衡的人。
3个回答

6

由于它是一个ICommunicationObject,因此需要在工厂中调用Open,使用之前需要将其打开。但在大多数情况下,当您调用CreateChannel等操作时,工厂会自动打开,因此您很少需要担心显式地打开工厂。

关于Close,这实际上取决于工厂使用的绑定方式。在大多数情况下,您是正确的,资源大多与通道相关联。但是,某些绑定可能会在同一底层连接中复用多个通道,因此关闭通道将仅从要复用的列表中删除该通道。只有在关闭工厂时才会释放底层连接。


感谢您的回复,Cybermaxs。我不熟悉多路复用,并且在谷歌搜索后没有找到太多帮助。您能指引我在哪里可以找到有关它的信息以及通道工厂如何管理这些情况下的底层连接吗?此外,如果您对我的问题有更多想法,我已经更新了我的问题并提供了更具体的问题。 - Trey Combs

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")));
    }
}

就像其他人在这里提到的那样,Close 事件也用于执行一些操作,例如关闭所有底层通道(通过其内部通道工厂):

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());
    }
}

0

打开ChannelFactory或innerchannel只是改变对象的状态,当实例化时,它开始于Created状态,对象可以被配置但不能用于发送或接收消息,在Opened状态下,communicationObject可用但不再可配置。

因此,打开工厂只是一种设计选择,当您创建第一个通道时,它确实会自动完成,它在幕后并没有太多作用,工厂负责创建通道,这些通道实际上将从传输层获取消息并将其发送到您的应用程序。

通道工厂负责创建通道。由通道工厂创建的通道用于发送消息。这些通道负责从上面的层获取消息,执行必要的处理,然后将消息发送到下面的层。以下图形说明了这个过程

http://msdn.microsoft.com/en-us/library/ms789050.aspx

希望这能有所帮助


谢谢您的回复。您能详细说明一下开放工厂的目的吗?您说:“因此,开放工厂的目的只是一种设计选择,当您创建第一个通道时它确实会自动完成,它在幕后并没有太多作用。” 我试图理解为什么必须打开工厂。他们为什么要做出这个设计选择;它有什么作用?为什么工厂实现ICommunicationObject,而同时也用于创建实现它的通道? - Trey Combs
抱歉,我不知道微软为什么做出这个选择,因为我不知道(也认为我无法知道)ChannelFactory的实现方式以及它创建的通道。希望如果有人了解更多,能够告诉我们 :) - MaRuf

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