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