解决方法
真正的问题归结为两部分
>为什么ChannelFactory派生自CommunicationObject
>它的国家实际上是什么意思?
第二个更容易回答,让我们从那里开始. ChannelFactory的状态确定是否可以用于创建新的客户端通道,以及这些客户端通道是否仍然可以使用.
与WCF中的所有CommunicationObject一样,状态确定您允许使用对象执行的操作.一个渠道工厂真的只有一个操作:CreateChannel.如果工厂是开放的,您可以创建渠道;如果它是关闭或故障,你不能.关闭()’d时,具体的(内部)通道工厂实现(例如和HttpChannelFactory)清理任何内部资源.这包括释放为安全目的创建的资源,释放命名管道的句柄等.
另外,当您关闭()通道工厂时,它将循环遍历所有通道,并在其中每个通道之前调用Close(),然后再转换到Closed状态. (似乎有一些常见的实用程序代码(创建HTTP请求等),渠道工厂代表他们的渠道实现,这样一旦频道工厂关闭,这些频道就无法再运行,这就是为什么频道是同时强制关闭.)
对于所有的血腥细节,去下载WCF Reference Source,但准备失去一天左右:)
那么更大的问题是,为什么一个ChannelFactory是一个CommunicationObject呢?在这里,我正在试图猜测,因为只要我看到工厂对象本身从来没有真正地与远程系统通信.但是,在创建通道之前,他们确实对其绑定参数进行了大量的设置和验证,这需要分配与实际网络连接相同的资源.例如,命名管道通道工厂创建并管理其通道的连接池; HTTP和HTTPS通道工厂验证身份信息和身份验证值.我的猜测是,渠道工厂做这个设置工作一次,所以渠道可以跳过它; CommunicationObject模式简单地提供了管理通道工厂生命周期的便利方式,因为WCF中的其他任何东西都是以这种方式进行管理的.