WCF ChannelFactory 状态属性
Posted
技术标签:
【中文标题】WCF ChannelFactory 状态属性【英文标题】:WCF ChannelFactory State Property 【发布时间】:2011-01-01 23:02:51 【问题描述】:ChannelFactory 拥有 State 属性意味着什么?我了解创建的频道可以具有基于连接的状态。但是我很困惑为什么 ChannelFactory 也有这样的连接状态。它是否也连接到 WCF 服务?
【问题讨论】:
我认为这是一个很好的问题,我也很好奇。很惊讶没有人对它进行攻击。 【参考方案1】: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
将是负责连接的对象。频道只是公开合约。【参考方案2】:
我认为这很有趣,我不知道答案,但我猜测 ChannelFactory 可能会保留可用资源,以防其他通道实例使用相同的资源(同时或在不久的将来)。
例如,如果您将通道工厂与使用 TcpChannel 作为传输通道的通道堆栈一起使用,则 TCP 连接可能由 ChannelFactory 管理,因为多个通道可能会重用相同的 TCP 连接,这样可以节省断开/重新启动连接的性能开销。
因此,当您关闭频道时,频道会通知频道工厂不再需要该资源,然后频道工厂可以在其认为合适的时候释放资源(即超时后?)。
如果没有其他人提供好的答案,我可以检查一下。
【讨论】:
以上是关于WCF ChannelFactory 状态属性的主要内容,如果未能解决你的问题,请参考以下文章
WCF ChannelFactory 和通道 - 缓存、重用、关闭和恢复
WCF ChannelFactory 转换接口到 IClientChannel 可疑转换
WCF - 是不是可以使用 HttpListener 或套接字来监听 WCF ChannelFactory
何时在服务参考上使用 WCF ChannelFactory [重复]
带有 ChannelFactory 的 WCF 客户端,方法返回 ProtocolException / 405 Method not Allowed