WCF ChannelFactory State属性

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

ChannelFactory对象具有State因为它是CommunicationObject ,并且WCF中的所有CommunicationObjects都具有State 。 当然,这只是提出问题,而不是真正有用。

真正的问题归结为两部分

  1. 为什么 ChannelFactory派生自CommunicationObject
  2. 它的State实际意味着什么?

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

与WCF中的所有CommunicationObjectsState确定允许对该对象执行哪些操作。 通道工厂实际上只有一个操作: CreateChannel 。 如果工厂是Open你可以创建渠道; 如果它是ClosedFaulted ,你不能。 具体(内部)通道工厂实现(例如,和HttpChannelFactory )在它们是Close()时清除任何内部资源; 这包括释放为安全目的而创建的资源,释放命名管道的句柄等。

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

对于所有血腥细节,请下载WCF参考源 ,但要准备好丢失一天左右:)

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

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

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

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

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