C# WCF ChannelFactory状态属性
工厂拥有国有财产意味着什么?我知道创建的通道可以具有基于连接的状态。但是我不明白为什么ChannelFactory也有这样的连接状态。它是否也连接到WCF服务?我认为这很有趣,我不知道答案,但我想冒险猜测一下,ChannelFactory可能会保持资源可用,以防其他通道实例使用相同的资源(同时或在不久的将来) 例如,如果使用具有使用TCP通道作为传输通道的通道堆栈的通道工厂,则TCP连接可能由通道工厂管理,因为多个通道可能会重新使用同一TCP连接,这可以节省断开/重新初始化连接的性能开销 因此,当您关闭频道时,频道会通知频道工厂不再需要该资源,然后频道工厂可以在其认为合适时(即超时后?)自由释放该资源C# WCF ChannelFactory状态属性,c#,wcf,state,channel,channelfactory,C#,Wcf,State,Channel,Channelfactory,工厂拥有国有财产意味着什么?我知道创建的通道可以具有基于连接的状态。但是我不明白为什么ChannelFactory也有这样的连接状态。它是否也连接到WCF服务?我认为这很有趣,我不知道答案,但我想冒险猜测一下,ChannelFactory可能会保持资源可用,以防其他通道实例使用相同的资源(同时或在不久的将来) 例如,如果使用具有使用TCP通道作为传输通道的通道堆栈的通道工厂,则TCP连接可能由通道工厂管理,因为多个通道可能会重新使用同一TCP连接,这可以节省断开/重新初始化连接的性能开销 因此,
如果没有其他人提供好的答案,我可以检查这种情况。一个
通道工厂
对象有一个状态
,因为它是一个通信对象
,WCF中的所有通信对象都有一个状态
。当然,这只是一个乞求的问题,并没有真正的帮助
真正的问题归结为两部分
为什么ChannelFactory
源自CommunicationObject
它的状态实际上意味着什么
第二个问题更容易回答,让我们从这里开始。ChannelFactory的状态
决定它是否可用于创建新的客户端频道,以及这些客户端频道是否仍可使用
与WCF中的所有通信对象
一样,状态
确定允许您对该对象执行的操作。频道工厂实际上只有一个操作:CreateChannel
。如果工厂处于打开状态
可以创建频道;如果已关闭
或出现故障
,则不能执行此操作。具体的(内部)通道工厂实现(例如,和HttpChannelFactory
)在Close()关闭时清理任何内部资源;这包括释放为安全目的创建的资源、释放命名管道的句柄等
此外,当您Close()
一个通道工厂时,它会在所有通道中循环,并在每个通道上调用Close()
,然后转换为Closed
状态。(通道工厂代表其通道执行一些常见的实用程序代码(创建HTTP请求等),因此一旦关闭通道工厂,通道将无法再运行。这就是为什么同时强制关闭通道。)
对于所有血淋淋的细节,请下载,但要准备好失去一天左右:)
那么,更大的问题是,为什么一个ChannelFactory
是一个CommunicationObject
?在这里,我求助于猜测,因为就我所知,工厂对象本身从未真正与远程系统通信。但是,在创建通道之前,它们确实会执行大量绑定参数的设置和验证,这需要分配与实际网络连接相同的资源。例如,命名管道通道工厂为其通道创建和管理连接池;HTTP和HTTPS通道工厂验证身份信息和身份验证值。我的猜测是频道工厂只做一次设置工作,所以频道可以跳过它;CommunicationObject
模式只是提供了一种方便的方法来管理通道工厂的生命周期,因为WCF中的所有其他内容都是以这种方式管理的。我认为这是一个好问题,也是一个我很好奇的问题。很惊讶没有人尝试过。我怀疑所有的渠道都经过渠道工厂。将其视为flyweight模式端点和绑定配置,以及连接状态。从技术上讲,ChannelFactory
将是负责连接的对象。该频道只是公开了合同。