【发布时间】:2011-01-01 23:02:51
【问题描述】:
ChannelFactory 拥有 State 属性意味着什么?我了解创建的频道可以具有基于连接的状态。但是我很困惑为什么 ChannelFactory 也有这样的连接状态。它是否也连接到 WCF 服务?
【问题讨论】:
-
我认为这是一个很好的问题,我也很好奇。很惊讶没有人对它进行攻击。
标签: c# wcf state channel channelfactory
ChannelFactory 拥有 State 属性意味着什么?我了解创建的频道可以具有基于连接的状态。但是我很困惑为什么 ChannelFactory 也有这样的连接状态。它是否也连接到 WCF 服务?
【问题讨论】:
标签: c# wcf state channel channelfactory
ChannelFactory 对象有一个State,因为它是一个CommunicationObject,并且WCF 中的所有CommunicationObjects 都有一个State。当然,这只是在乞求问题,并没有真正的帮助。
真正的问题归结为两部分
ChannelFactory 派生自CommunicationObject State究竟是什么意思?第二个更容易回答,所以让我们从那里开始。 ChannelFactory 的State 决定了它是否可以用来创建新的客户端通道,以及这些客户端通道是否仍然可以使用。
与 WCF 中的所有 CommunicationObjects 一样,State 确定您可以对对象执行哪些操作。渠道工厂真的只有一个操作:CreateChannel。如果工厂是Open,则可以创建频道;如果是Closed 或Faulted,则不能。具体的(内部)通道工厂实现(例如,HttpChannelFactory)会在 Close()'d 时清理所有内部资源;这包括释放出于安全目的而创建的资源、释放命名管道的句柄等。
此外,当您 Close() 一个通道工厂时,它会循环遍历所有通道并在每个通道上调用 Close(),然后再转换到 Closed 状态本身。 (似乎有一些通用实用程序代码(创建 HTTP 请求等)由通道工厂代表其通道实现,这样一旦通道工厂关闭,通道就无法再运行。这就是为什么通道是同时强制关闭。)
有关所有血腥细节,请下载WCF Reference Source,但要准备好浪费一天左右的时间:)
那么,更大的问题是为什么ChannelFactory 是CommunicationObject?在这里,我只是在猜测,因为据我所知,工厂对象本身从未实际上与远程系统通信。但是,它们在创建通道之前确实对其绑定参数进行了大量设置和验证,这需要分配与实际网络连接相同的资源。例如,命名管道通道工厂为其通道创建和管理连接池; HTTP 和 HTTPS 通道工厂验证身份信息和身份验证值。我的猜测是通道工厂只做一次这个设置工作,所以通道可以跳过它; CommunicationObject 模式只是提供了一种方便的方式来管理通道工厂的生命周期,因为 WCF 中的所有其他内容都是以这种方式管理的。
【讨论】:
ChannelFactory 将是负责连接的对象。频道只是公开合约。
我认为这很有趣,我不知道答案,但我猜测 ChannelFactory 可能会保留可用资源,以防其他通道实例使用相同的资源(同时或在不久的将来)。
例如,如果您将通道工厂与使用 TcpChannel 作为传输通道的通道堆栈一起使用,则 TCP 连接可能由 ChannelFactory 管理,因为多个通道可能会重用相同的 TCP 连接,这样可以节省断开/重新启动连接的性能开销。
因此,当您关闭频道时,频道会通知频道工厂不再需要该资源,然后频道工厂可以在其认为合适的时候释放资源(即超时后?)。
如果没有其他人提供好的答案,我可以检查一下。
【讨论】: