7

我试图更好地了解 WCF 的一些内部工作原理。我已经做了很多环顾四周,但我无法找到ChannelFactory.Open()IClientChannel.Open(). 开厂的目的是什么?如果通道是用于通信的,那么在通道创建和打开后,工厂在这个过程中扮演什么角色?

这个问题在这里被问到,在其他问题中,但从未直接回答。

编辑:

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

我仍然难以理解的是为什么这项工作是通过 ICommunicationObject 提供的机制完成的,而工厂实际上并没有与任何东西通信(据我所知)。为什么不在对象被构造或处置时处理这些事情呢?

我认为我可能在杂草中已经足够远了,这样的答案可能不会公开。感谢那些对原始问题进行权衡的人。

4

3 回答 3

6

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

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

于 2012-08-16T15:22:32.983 回答
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")));
    }
}

正如其他人在这里提到的那样,关闭事件也用于关闭所有底层通道(通过它的内部通道工厂):

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());
    }
}
于 2012-08-16T17:50:21.213 回答
0

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

所以打开工厂的目的只是一个设计选择,当你创建第一个通道时,它确实是自动完成的,它在后台并没有太多,工厂负责创建实际从传输中带来消息的通道层并将它们发送给您的应用程序。

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

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

希望这可以帮助

于 2012-08-16T05:32:59.677 回答