【问题标题】:What's the opposite to ChannelFactory<TChannel>.CreateChannel?ChannelFactory<TChannel>.CreateChannel 的对立面是什么?
【发布时间】:2011-12-19 10:14:48
【问题描述】:

我只是按照this 教程操作了一下代码。我几乎可以肯定我在某处读到该频道有超时,因此它最终可能会自动关闭。因此,我尝试在客户端中为我想调用的每个方法简单地打开一个新通道,最终(经过多次调用)我得到了错误。

我可以同时打开多少个频道似乎是有限制的。但是由于通道是自定义对象的一个​​实例,我不知道如何关闭它或杀死它,或者我需要做些什么来摆脱它,以便创建其他通道。

然后我注意到CreateChanneldocumentation 我的TChannel 应该实现IChannel(我上面链接的教程没有这样做)。那么,这就是我关闭频道的方式吗?如果是这样,我将如何关闭它或者我应该如何执行Close 方法?如果我必须实现接口,我应该如何实现其他所有方法?

或者我应该只使用一个频道,只要它持续存在?无论如何,如果我所拥有的只是我自己的类的一个实例,我应该如何知道是故障、打开还是关闭?

如你所见,我对这个主题很迷茫,所以我希望你能指出我正确的方向。

【问题讨论】:

    标签: c# wcf channelfactory


    【解决方案1】:

    ChannelFactory&lt;TChannel&gt;.CreateChannel 创建并返回您指定服务类型的频道。返回的对象已经实现了IChannel。您(通常?)不需要实现自己的 Close 方法,也不需要实现 IChannel 的任何其他方法。

    通常您不会为每次通话都创建一个新频道,而只是重复使用它。 (仅在某些特定情况下,为每个呼叫创建一个新频道可能会更好)。

    您可以通过将频道强制转换为IClientChannel 来关闭频道。使用这种模式:

    try
    {
      ((IClientChannel)channel).Close();
    }
    catch (Exception ex)
    {
      ((IClientChannel)channel).Abort();
    }
    

    您可以使用((IClientChannel)channel).State 获取通道的状态(即CreatedOpenedFaultedClosed)。

    【讨论】:

    • 谢谢,我稍后会试一试,因为我现在很喜欢。无论如何,你怎么知道这种东西?在文档中找不到太多信息。我不想要求我做的任何事情。这是你只能在书中找到的信息吗?
    • 我使用了几个来源,这些来源是通过 CodeProject.com、MSDN、dotnetconsult.co.uk 等搜索发现的。当然还有最大的来源...... StackOverflow ;)
    【解决方案2】:

    Peladao 基本上一针见血。

    为了澄清他所说的一些内容,CreateChannel 将创建一个(代理)对象,该对象实现您的自定义服务接口 IClientChannel。

    通常您会保持通道打开并重复使用它的调用。还要注意,一旦它进入故障状态就无法恢复,您必须打开一个新通道。正如 Peladao 提到的,可以通过 ((IClientChannel)channel).State 检测到故障状态,并且不要忘记您通常也会遇到异常。

    如果内存够用,WCF 的调试过程会接受 10 个同时为服务提供的通道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 2015-09-23
      • 1970-01-01
      • 2021-03-19
      相关资源
      最近更新 更多