0

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

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

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

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

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

4

2 回答 2

5

ChannelFactory<TChannel>.CreateChannel创建并返回您指定的服务类型的频道。返回的对象已经实现IChannel。您(通常?)不需要实现自己的Close方法,也不需要IChannel.

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

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

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

您可以使用((IClientChannel)channel).State来获取通道的状态(即CreatedOpened, Faulted, Closed)。

于 2011-12-19T10:20:39.607 回答
1

Peladao 基本上一针见血。

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

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

如果内存服务,WCF 的调试过程接受服务的 10 个同时通道。

于 2011-12-19T10:39:52.273 回答