10

ChannelFactory 拥有 State 属性意味着什么?我了解创建的频道可以具有基于连接的状态。但是我很困惑为什么 ChannelFactory 也有这样的连接状态。它是否也连接到 WCF 服务?

4

2 回答 2

9

一个ChannelFactory对象有一个State,因为它是一个CommunicationObject,并且CommunicationObjectsWCF 中的所有对象都有一个State。当然,这只是在乞求问题,并没有真正的帮助。

真正的问题归结为两个部分

  1. 为什么派生ChannelFactoryCommunicationObject
  2. 它的State实际含义是什么

第二个更容易回答,所以让我们从那里开始。ChannelFactory的State决定它是否可以用来创建新的客户端通道,以及这些客户端通道是否仍然可以使用。

CommunicationObjectsWCF 中的所有内容一样,State确定您可以对对象执行的操作。渠道工厂真的只有一个操作:CreateChannel. 如果工厂是Open您可以创建渠道;如果是ClosedFaulted,则不能。具体的(内部)通道工厂实现(例如 和)在它们被'dHttpChannelFactory时清理任何内部资源;Close()这包括释放为安全目的而创建的资源、释放命名管道的句柄等。

此外,当您Close()使用通道工厂时,它会遍历所有通道并调用Close()每个通道,然后再转换为Closed状态本身。(似乎有一些通用实用程序代码(创建 HTTP 请求等)由通道工厂代表其通道实现,这样一旦通道工厂关闭,通道就无法再运行。这就是为什么通道是同时强制关闭。)

有关所有血腥细节,请下载WCF 参考源,但要准备好浪费一天左右的时间 :)

那么,更大的问题是,为什么 aChannelFactory是 aCommunicationObject呢?在这里,我只是在猜测,因为据我所知,工厂对象本身从未真正与远程系统通信。但是,它们在创建通道之前确实对其绑定参数进行了大量设置和验证,这需要分配与实际网络连接相同的资源。例如,命名管道通道工厂为其通道创建和管理连接池;HTTP 和 HTTPS 通道工厂验证身份信息和身份验证值。我的猜测是通道工厂只做一次这个设置工作,所以通道可以跳过它;这CommunicationObject模式只是提供了一种方便的方式来管理通道工厂的生命周期,因为 WCF 中的所有其他内容都是以这种方式管理的。

于 2012-03-14T15:41:49.190 回答
0

我认为这很有趣,我不知道答案,但我猜测 ChannelFactory 可能会保持资源可用,以防其他通道实例将使用相同的资源(同时或在不久的将来)。

例如,如果您使用具有使用 TcpChannel 作为传输通道的通道堆栈的通道工厂,则 TCP 连接可能由 ChannelFactory 管理,因为多个通道可能会重用相同的 TCP 连接,这样可以节省性能开销拆除/重新启动连接。

因此,当您关闭通道时,通道会通知通道工厂不再需要该资源,然后通道工厂可以在它认为合适的时候释放资源(即超时后?)。

如果没有其他人提供好的答案,我可以检查一下。

于 2012-01-17T14:12:08.483 回答