Tre*_*mbs 7 .net c# wcf wcf-client
我试图更好地理解WCF的一些内部工作原理.我已经做了相当多的环顾四周,但是我无法找到ChannelFactory.Open()与之相比的明确解释IClientChannel.Open().开工厂的目的是什么?如果正在使用该通道进行通信,那么在创建和打开通道后,工厂将在该过程中播放哪个部分?
有人问在这里,其他的问题之一,但从来没有直接回答.
编辑:
在对源代码进行反编译之后,我发现了需要在ChannelFactory上调用Open的一些具体原因,如下所述.
我仍然无法理解的是,为什么这项工作是通过ICommunicationObject提供的机制完成的,当工厂实际上没有与任何东西进行通信时(据我所知).为什么不在构造或处理对象时处理这些事情?
我想我可能已经远远不够杂草,这样的答案可能无法公开.感谢那些权衡原始问题的人.
Open需要在工厂中调用,因为它是ICommunicationObject - 在使用其中之一之前,需要打开它.但在大多数情况下,当您调用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")));
}
}
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)