Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF ChannelFactory状态属性_C#_Wcf_State_Channel_Channelfactory - Fatal编程技术网

C# WCF ChannelFactory状态属性

C# WCF ChannelFactory状态属性,c#,wcf,state,channel,channelfactory,C#,Wcf,State,Channel,Channelfactory,工厂拥有国有财产意味着什么?我知道创建的通道可以具有基于连接的状态。但是我不明白为什么ChannelFactory也有这样的连接状态。它是否也连接到WCF服务?我认为这很有趣,我不知道答案,但我想冒险猜测一下,ChannelFactory可能会保持资源可用,以防其他通道实例使用相同的资源(同时或在不久的将来) 例如,如果使用具有使用TCP通道作为传输通道的通道堆栈的通道工厂,则TCP连接可能由通道工厂管理,因为多个通道可能会重新使用同一TCP连接,这可以节省断开/重新初始化连接的性能开销 因此,

工厂拥有国有财产意味着什么?我知道创建的通道可以具有基于连接的状态。但是我不明白为什么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
    将是负责连接的对象。该频道只是公开了合同。