WCF ChannelFactory State属性

Nic*_*las 10 c# wcf state channel channelfactory

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

Mic*_*eld 9

一个ChannelFactory对象有一个State因为它是一个CommunicationObject,而且所有CommunicationObjects在WCF中都有一个State.当然,这只是提出问题,而不是真正有用.

真正的问题归结为两部分

  1. 为什么ChannelFactory从派生CommunicationObject
  2. 什么做它State实际上意味着什么?

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

CommunicationObjectsWCF中的所有内容一样,State确定允许对对象执行哪些操作.一个渠道工厂真的只有一个操作:CreateChannel.如果工厂是Open你可以创建渠道; 如果是,Closed或者Faulted你不能.具体(内部)渠道工厂实施(比如说,和HttpChannelFactory)清理任何内部资源Close().这包括释放为安全目的而创建的资源,释放命名管道的句柄等.

此外,当你Close()是一个频道工厂时,它会Close()在转换到一个Closed状态之前循环遍历所有频道并调用每个频道.(通道工厂代表其通道实现了一些常见的实用程序代码(创建HTTP请求等),这样一旦通道工厂关闭,通道就无法再运行了.这就是通道的原因.同时被迫关闭.)

对于所有血腥细节,请下载WCF参考源,但要准备好丢失一天左右:)

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


小智 0

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

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

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

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