代码之家  ›  专栏  ›  技术社区  ›  Daniel Auger

ChannelFactory.Close VS IClientChannel.Close

  •  30
  • Daniel Auger  · 技术社区  · 15 年前

    考虑下面的代码,这是许多通道工厂示例的典型代码:

    WSHttpBinding myBinding = new WSHttpBinding();
    EndpointAddress myEndpoint = new EndpointAddress(
       ConfigurationSettings.AppSettings["HelloWorldServiceURL"]);  
    
    ChannelFactory<IHelloWorldService> myChannelFactory = 
       new ChannelFactory<IHelloWorldService>(myBinding, myEndpoint);
    
    IHelloWorldService proxy = myChannelFactory.CreateChannel();
    ((IClientChannel)proxy).Open();
    HelloWorldDataContract dc = proxy.SayHello();
    ((IClientChannel)proxy).Close();
    

    请注意,调用proxy.Open()时,通道的状态和通道工厂的状态都变为“打开”。调用proxy.Close()时,通道的状态变为“关闭”,但通道工厂的状态保持为“打开”。

    是否也应该关闭工厂?我似乎在很多例子中都没有看到这一点。此外,如果可能,请解释开放频道与开放频道工厂之间的区别。

    此外,我知道 IDisposable issue

    4 回复  |  直到 7 年前
        1
  •  19
  •   Aliostad    13 年前

    我发现主要答案不准确,所以我在这里作出回应。

    乱七八糟 从渠道、工厂和客户那里。文档也没有帮助,因为它们似乎只是为了掩盖混乱,所以我不得不求助于测试。

    由于非缓存通道的性能问题,在中更改了实现 v3.5 为了解决这些问题,需要添加缓存,但这只会使问题变得复杂。

    这一点很重要 ChannelFactory 事实上,与 IClientChannel 使用创建通道时 ChannelFactory.CreateChannel()

    ChannelFactory<IService> factory = new ChannelFactory<IService>();
    // ...
    IService service = factory.CreateChannel();
    factory.Close();
    service.DoIt() // Throws object disposed exception
    

    因此,实际上,在内部,这是所有相同的渠道。我个人已经开始处理渠道工厂而不是客户渠道,并且没有遇到任何问题。我也尝试过在一个循环中创建100000个客户端通道,并且只关闭 渠道工厂 .

        2
  •  14
  •   JP Alioto    15 年前

    正如您所知,ChannelFactory根据配置创建客户端通道。您可能希望从现有工厂(到锁定的同一端点)创建多个客户端通道。如果已使用工厂创建通道,则没有理由不关闭它。

    但是,你为什么要让它开着呢?这里有一个有趣的例子 article on WCF clients

    检查 System.ServiceModel.ICommunicationObject.State 不建议确定是否 重新使用或关闭频道。

    与重用通道不同,您可能只想使用通道工厂创建一个新的通道。 More on the client architecture is here .

        3
  •  4
  •   Cesar Maiorino    13 年前

    另一个选项是使用静态CreateChannel方法: msdn.microsoft.com/en-us/library/aa344556.aspx

        4
  •  2
  •   TamaMcGlinn    6 年前

    答案已经在这里了,但它是分散在几个评论和答案,并不完全清楚,因此我的答案。

    我们应该关闭渠道工厂和渠道吗?

    否。如果要从每个ChannelFactory创建多个频道,则应处置ChannelFactory,这将处置它为您创建的所有频道。

    如果要为每个(端点、绑定)对创建一个通道,应该使用 this static function : ChannelFactory<ServiceType>.CreateChannel(binding, endpoint)

    处理channelfactory及其创建的任何通道都将引发ObjectDisposed异常。