WCF - 通道工厂 vs 客户端基础

24

我对WCF比较新。一开始,我创建了一个WCF服务,并使用生成的客户端代理从客户端消费该服务。因此,每当我在服务上执行某些操作时,所有操作都会按顺序执行,因为我是同步调用操作。我将并发模式更改为多个,但仍然同步发生操作。然后,我为我的操作生成了异步方法,并使用了开始/结束模式,这样我猜可以“释放”通道并使操作以并行/异步方式发生,从而增加应用程序的吞吐量。

然后我使用了ChannelFactory来创建通道,并作为客户端执行了操作,因为客户端和服务器可以共享契约(同一项目)。但是IClientChannel只提供BeginOpen / EndOpen / BeignClose / EndClose。它没有ClientBaseBeginOperation / EndOperation方法。因此,基本上我无法在通道上异步执行操作,以便释放通道,以便我可以使用通道执行其他操作。

于是我为每个操作创建了通道,问题得到解决。

所以我的问题是:

  1. 在我的情况下(ClientBase vs. ChannelFactory),哪个更好,尤其是我想同时使用多个线程在服务对象上执行多个操作

  2. 为每个操作创建通道是否明智?

  3. 事实上,我认为我们只能在两个端点(客户端/服务)之间拥有一个通道。但是我可以创建任意多个通道。例如:我能够创建Int16.MaxValue个通道。因此不确定这方面的限制和建议。

Service[] channels = new IService[Int16.MaxValue];

for(int i = 0; i<Int16.MaxValue; i++)
{
   channels[i] = factory.CreateChannel();
}
所以基本上,您能否请告诉我有关频道、建议和技巧等基础知识等等? :)
1个回答

28
使用异步操作时,在ClientBaseChannelFactory<T>之间有一些区别。基本上,ClientBase使用基于事件的异步模型。
我在开发工作中广泛使用ChannelFactory<T>,主要是因为应用程序的合同可在公共库中使用,而且我不喜欢使用添加服务引用的方式。我在创建每个唯一实例的ChannelFactory时进行缓存,然后当我需要调用操作时,我将从该实例打开通信频道,进行调用,并关闭通信频道。
WCF的大部分启动成本都在客户端的创建过程中,这种方式可以使得你只需要为应用程序的生命周期支付一次成本-创建通信频道是微不足道的。
关于ClientBaseChannelFactory<T>的更多异步信息,请参见: 如何:异步调用WCF服务操作 如何:使用通道工厂异步调用操作

谢谢 Tim。是的,我也在做几乎相同的事情。为每个操作创建一个新的通信通道并关闭它。我看过这些链接,但还有一些问题。1. 建议使用多少个通道?2. 要使用通道工厂同步执行操作,只需将BeginOp/EndOp方法添加到通道接口即可。其余所有内容都由WCF处理——换句话说,svcutil工具会生成大量我们不感兴趣的代码。我们只对接口定义感兴趣,让WCF来完成繁重的工作。如果可以,这很酷。 - Dreamer
除了上面的问题,还有其他需要解答的吗? - Tim
@Dreamer - 我认为没有推荐的频道数量。如果您有很多客户端,可能会遇到并发连接问题,但您可以在配置中进行调整。至于您的第二个问题,我还没有在WCF中执行任何异步操作(我们正准备在下一次工作中执行此操作),但我认为只要接口正确,您应该没问题。 - Tim
谢谢Tim。顺便问一句,你有没有看我的另一个问题(WCF - 根据标记/条件创建单个客户端的多个服务实例(而不是基于percall))? - Dreamer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接