WCF ChannelFactory 状态属性

Posted

技术标签:

【中文标题】WCF ChannelFactory 状态属性【英文标题】:WCF ChannelFactory State Property 【发布时间】:2011-01-01 23:02:51 【问题描述】:

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

【问题讨论】:

我认为这是一个很好的问题,我也很好奇。很惊讶没有人对它进行攻击。 【参考方案1】:

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

真正的问题归结为两部分

    为什么ChannelFactory 派生自CommunicationObject 它的State究竟是什么意思

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

与 WCF 中的所有 CommunicationObjects 一样,State 确定您可以对对象执行哪些操作。渠道工厂真的只有一个操作:CreateChannel。如果工厂是Open,则可以创建频道;如果是ClosedFaulted,则不能。具体的(内部)通道工厂实现(例如,HttpChannelFactory)会在 Close()'d 时清理所有内部资源;这包括释放出于安全目的而创建的资源、释放命名管道的句柄等。

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

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

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

【讨论】:

我怀疑所有通道都通过通道工厂路由。将其视为享元模式端点和绑定配置以及连接状态。从技术上讲,ChannelFactory 将是负责连接的对象。频道只是公开合约。【参考方案2】:

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

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

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

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

【讨论】:

以上是关于WCF ChannelFactory 状态属性的主要内容,如果未能解决你的问题,请参考以下文章

WCF ChannelFactory 和连接超时的最佳实践

WCF ChannelFactory 和通道 - 缓存、重用、关闭和恢复

WCF ChannelFactory 转换接口到 IClientChannel 可疑转换

WCF - 是不是可以使用 HttpListener 或套接字来监听 WCF ChannelFactory

何时在服务参考上使用 WCF ChannelFactory [重复]

带有 ChannelFactory 的 WCF 客户端,方法返回 ProtocolException / 405 Method not Allowed