我刚刚关注了this教程,并对代码进行了一些操作。我几乎可以肯定我在某个地方读到了频道超时,因此最终会自动关闭。所以我尝试在我的客户端中为我想要调用的每个方法打开一个新的通道,最终(经过大量的调用后)我遇到了错误。
似乎我可以同时打开多少个频道。但由于频道是自定义对象的一个实例,我不知道如何关闭它或者杀死它或者我需要做什么来摆脱它以便我可以创建其他频道。
然后我在CreateChannel
documentation上注意到我的TChannel
应该实现IChannel
(我上面链接的教程没有这样做)。那么,这是我关闭我的频道的方式吗?如果是这样,我将如何关闭它或我应该如何执行Close
方法?如果我必须实现接口,我应该怎么做其他方法的实现?
或者我应该只使用一个频道,只要它持续?无论如何,如果我所拥有的只是我自己的一个实例,我怎么知道是出现故障还是打开或关闭?
正如你所看到的那样,我对这个问题非常失落,所以我希望你能指出我正确的方向。
答案 0 :(得分:5)
ChannelFactory<TChannel>.CreateChannel
创建并返回指定服务类型的频道。返回的对象已实现IChannel
。你(通常?)不需要实现自己的Close
方法,也不需要实现IChannel
的任何其他方法。
通常,您不会为每次通话创建新频道,只需重新使用即可。 (仅在某些特定情况下,为每次通话创建新频道可能更好。)
您可以将频道投放到IClientChannel
来关闭频道。使用这种模式:
try
{
((IClientChannel)channel).Close();
}
catch (Exception ex)
{
((IClientChannel)channel).Abort();
}
您可以使用((IClientChannel)channel).State
获取频道的状态(例如CreatedOpened
,Faulted
,Closed
)。
答案 1 :(得分:1)
为了澄清他所说的一些内容,CreateChannel将创建一个(代理)对象,该对象实现自定义服务接口和 IClientChannel。
通常,您确保打开频道并重复使用其呼叫。还要注意,一旦它进入故障状态就没有恢复,你必须打开一个新的通道。正如Peladao所提到的,可以通过((IClientChannel)通道).State来检测故障状态,并且也不要忘记你通常也会得到异常。
如果内存服务,WCF的调试过程接受10个服务的同时通道。