WCF ChannelFactory 状态属性

10

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


我认为这是一个好问题,也是我很感兴趣的问题。惊讶的是还没有人尝试过它。 - Xiaofu
2个回答

9
一个ChannelFactory对象有一个State,因为它是一个CommunicationObject,WCF中的所有CommunicationObjects都有一个State。当然,这只是在回避问题,并没有真正帮助到你。
实际问题可以分成两个部分:
1. 为什么ChannelFactory派生自CommunicationObject? 2. 它的State实际上意味着什么?
第二个问题更容易回答,所以让我们从那里开始。一个ChannelFactory的State决定了是否可以用来创建新的客户端通道,以及这些客户端通道是否仍然可以使用。
与WCF中的所有CommunicationObjects一样,State决定了您可以对对象执行哪些操作。通道工厂实际上只有一个操作:CreateChannel。如果工厂是Open状态,则可以创建通道;如果是ClosedFaulted,则不能。具体的(内部)通道工厂实现(例如HttpChannelFactory)在Close()时清理任何内部资源;这包括释放为安全目的创建的资源,释放对命名管道的句柄等。
此外,当您Close()一个通道工厂时,它会遍历所有通道并在转换为Closed状态之前调用每个通道的Close()。(似乎有一些常见的实用程序代码(创建HTTP请求等),通道工厂代表其通道实现,因此一旦关闭通道工厂,通道就无法再正常工作。这就是为什么通道在同一时间被强制关闭的原因。)
要了解所有细节,请下载WCF参考源代码,但要准备失去一天或更长时间:)
那么,更大的问题是为什么ChannelFactory会成为一个CommunicationObject呢?在这里,我只能猜测,因为据我所见,工厂对象本身从未与远程系统进行实际通信。但是,它们确实在创建通道之前执行了很多设置和验证其绑定参数的操作,这需要分配与实际网络连接相同类型的资源。例如,命名管道通道工厂创建和管理其通道的连接池;HTTP和HTTPS通道工厂验证身份信息和身份验证值。我的猜测是,通道工厂只需完成一次此设置工作,以便通道可以跳过它;CommunicationObject模式只是提供了一种方便的方式来管理通道工厂的生命周期,因为WCF中的其他所有内容都是以这种方式管理的。

我怀疑所有的通道都通过通道工厂路由。可以将其视为享元模式的终结点和绑定配置,以及连接状态。从技术上讲,ChannelFactory 将是负责连接的对象。通道只是暴露合同。 - Gusdor

0

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

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

因此,当您关闭通道时,通道会通知通道工厂不再需要该资源,通道工厂随后可以自由释放资源,具体时间取决于它何时看到合适的时机(例如超时?)。

如果没有人提供好的答案,我可以检查一下是否是这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接