Silverlight中生成的WCF服务客户端是否重用ChannelFactory?

时间:2011-02-18 15:25:06

标签: silverlight wcf wcf-client channelfactory

在从silverlight调用WCF服务时,是否应该使用生成的WCF服务客户端(例如MyServiceClient),或者使用ChannelFactory(例如ChannelFactory.Create())?

其他问题提出了这个问题:WCF/Silverlight: Why use a ChannelFactory instead of a Client?

但是,回复只是说最好重新使用ChannelFactory。但如果这是直接完成的,则会丢失生成的WCF服务客户端的所有其他功能(异步事件等)。

是否无法让生成的WCF服务客户端重新使用ChannelFactory本身?

1 个答案:

答案 0 :(得分:0)

WCF Fiasco

<强> START_RANT

即使是Microsoft和WCF团队也知道ChannelFactoryChannel以及ClientBase的设计方式以及因各种性能问题而改变的方式是真正的惨败。只是处理代理是一个真正的混乱这一事实足以让我们知道WCF的可扩展性,我们正在处理一个无用的,臃肿的和错综复杂的设计。只是坏坏坏。

<强> END_RANT

好的,你可能已经查看了文档,但我认为你找不到答案 - 因为我没有 - 因为没有简单的答案。但是在这里我的发现有希望总结这些要点(你在下面的MS文档中找不到):

1)我们有ChannelFactoryIChannelChannelFactory知道如何与传输进行通信,并且通道知道如何将参数解释为WCF方法调用和反之亦然。 IChannel是“实现”(或看起来像实现)服务接口的那个,而ChannelFactory具有所有必要的通信抽象(包括端点,安全性......)。

2)ClientBase只是ChannelFactoryIChannel拼凑在一起。因此很明显,创建一次ChannelFactory然后一遍又一遍地创建频道意味着它更有效率,因为你认为它并不那么容易因为... ...

3)ChannelFactory一旦打开,就无法更改。这意味着如果您使用用户名密码连接到WCF服务并且用户名密码更改,那么您需要一个新密码。这似乎不是一个大问题,但它在ASP .NET场景中成为一个大问题。

4)ChannelFactoryIChannel实际上重用了相同的底层沟通渠道,因此关闭ChannelFactory将使IChannel无效。这会导致清理代码混乱,并决定谁负责关闭连接。

5)如你所见,没有简单的答案。如果您不必在运行时使用用户名/密码或更改配置,请创建并缓存ChannelFactory,然后只创建通道。在任何情况下,ChannelFactoryIChannel都比ClientBase更有效。