ChannelFactory有一个State属性意味着什么?我知道创建的通道可以具有基于连接的状态。但是,对于为什么ChannelFactory也具有这样的连接状态,我感到困惑。它是否也连接到WCF服务?
ChannelFactory有一个State属性意味着什么?我知道创建的通道可以具有基于连接的状态。但是,对于为什么ChannelFactory也具有这样的连接状态,我感到困惑。它是否也连接到WCF服务?
ChannelFactory
对象有一个State
,因为它是一个CommunicationObject
,WCF中的所有CommunicationObjects
都有一个State
。当然,这只是在回避问题,并没有真正帮助到你。ChannelFactory
派生自CommunicationObject
?
2. 它的State
实际上意味着什么?State
决定了是否可以用来创建新的客户端通道,以及这些客户端通道是否仍然可以使用。CommunicationObjects
一样,State
决定了您可以对对象执行哪些操作。通道工厂实际上只有一个操作:CreateChannel
。如果工厂是Open
状态,则可以创建通道;如果是Closed
或Faulted
,则不能。具体的(内部)通道工厂实现(例如HttpChannelFactory
)在Close()
时清理任何内部资源;这包括释放为安全目的创建的资源,释放对命名管道的句柄等。Close()
一个通道工厂时,它会遍历所有通道并在转换为Closed
状态之前调用每个通道的Close()
。(似乎有一些常见的实用程序代码(创建HTTP请求等),通道工厂代表其通道实现,因此一旦关闭通道工厂,通道就无法再正常工作。这就是为什么通道在同一时间被强制关闭的原因。)ChannelFactory
会成为一个CommunicationObject
呢?在这里,我只能猜测,因为据我所见,工厂对象本身从未与远程系统进行实际通信。但是,它们确实在创建通道之前执行了很多设置和验证其绑定参数的操作,这需要分配与实际网络连接相同类型的资源。例如,命名管道通道工厂创建和管理其通道的连接池;HTTP和HTTPS通道工厂验证身份信息和身份验证值。我的猜测是,通道工厂只需完成一次此设置工作,以便通道可以跳过它;CommunicationObject
模式只是提供了一种方便的方式来管理通道工厂的生命周期,因为WCF中的其他所有内容都是以这种方式管理的。ChannelFactory
将是负责连接的对象。通道只是暴露合同。 - Gusdor我认为这很有趣,虽然我不知道答案,但我猜测ChannelFactory可能会保留资源,以便其他通道实例将使用相同的资源(同时或在不久的将来)。
例如,如果您使用一个带有TcpChannel作为传输通道的通道堆栈的通道工厂,则TCP连接可以由ChannelFactory管理,因为多个通道可能会重复使用相同的TCP连接,这可以节省拆除/重新初始化连接的性能开销。
因此,当您关闭通道时,通道会通知通道工厂不再需要该资源,通道工厂随后可以自由释放资源,具体时间取决于它何时看到合适的时机(例如超时?)。
如果没有人提供好的答案,我可以检查一下是否是这种情况。