Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ChannelFactory.Open与IClientChannel.Open_C#_.net_Wcf_Wcf Client - Fatal编程技术网

C# ChannelFactory.Open与IClientChannel.Open

C# ChannelFactory.Open与IClientChannel.Open,c#,.net,wcf,wcf-client,C#,.net,Wcf,Wcf Client,我试图更好地理解WCF的一些内部工作原理。我已经环顾了很多地方,但是与IClientChannel.Open()相比,ChannelFactory.Open()的作用我还没有找到一个清晰的解释。开办工厂的目的是什么?如果频道用于通信,在创建和打开频道后,工厂在该过程中扮演什么角色 在其他问题中,有人问了这个问题,但从未直接回答过 编辑: 在对源代码进行反编译之后,我发现了需要在ChannelFactory上调用Open的一些具体原因,如下所述 我仍然难以理解的是,为什么这项工作是通过ICommu

我试图更好地理解WCF的一些内部工作原理。我已经环顾了很多地方,但是与
IClientChannel.Open()
相比,
ChannelFactory.Open()
的作用我还没有找到一个清晰的解释。开办工厂的目的是什么?如果频道用于通信,在创建和打开频道后,工厂在该过程中扮演什么角色

在其他问题中,有人问了这个问题,但从未直接回答过

编辑:

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

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


我想我可能已经深陷其中,这样的答案可能不会公开。感谢参与讨论原始问题的人。

打开ChannelFactory或innerchannel只需更改对象的状态,当实例化在创建状态下启动时,可以配置对象,但在打开状态下无法发送或接收消息,通信对象可用,但不再可配置

因此,开放工厂的目的只是一种设计选择,当您创建第一个通道时,它实际上是自动完成的,这并不需要太多,工厂负责创建一个通道,该通道将实际从传输层带来消息并将它们发送给您的应用程序

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


希望这有帮助,因为它是一个ICommunicationObject,所以需要在工厂中调用Open,在使用其中一个对象之前,需要将其打开。但是在大多数情况下,当您调用诸如CreateChannel之类的东西时,工厂会自动打开,因此您很少需要担心显式打开工厂


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

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());
    }
}
正如其他人在这里提到的,关闭事件还用于关闭所有底层通道(通过其内部通道工厂):


谢谢你的回复。你能详细说明开工厂的目的吗?你说,“所以开工厂的目的只是一个设计选择,当你创建第一个渠道时,它确实是自动完成的,在引擎盖下不会有太多。”。我在试图理解为什么工厂必须开张。他们为什么选择这种设计;它有什么用途?为什么工厂要实现ICommunicationObject,而它也被用来创建一个实现ICommunicationObject的通道?对不起,我不知道为什么Microsoft会这样做,因为我不知道(我想我也不知道)ChannelFactory是如何实现的,也不知道它创建的通道,我希望如果有人知道更多,会让我们知道:)谢谢你的回复,Cybermaxs。我不熟悉多路复用,在谷歌上搜索后也没有找到太多帮助。您能告诉我在哪里可以找到有关它的信息,以及在这些情况下通道工厂如何管理底层连接吗?此外,我还更新了我的问题,提供了更多信息,如果您还有其他想法,请回答一个更具体的问题。