在从silverlight调用WCF服务时,是否应该使用生成的WCF服务客户端(例如MyServiceClient),或者使用ChannelFactory(例如ChannelFactory.Create())?
其他问题提出了这个问题:WCF/Silverlight: Why use a ChannelFactory instead of a Client?
但是,回复只是说最好重新使用ChannelFactory。但如果这是直接完成的,则会丢失生成的WCF服务客户端的所有其他功能(异步事件等)。
是否无法让生成的WCF服务客户端重新使用ChannelFactory本身?
答案 0 :(得分:0)
<强> START_RANT 强>
即使是Microsoft和WCF团队也知道ChannelFactory
和Channel
以及ClientBase
的设计方式以及因各种性能问题而改变的方式是真正的惨败。只是处理代理是一个真正的混乱这一事实足以让我们知道WCF的可扩展性,我们正在处理一个无用的,臃肿的和错综复杂的设计。只是坏坏坏。
<强> END_RANT 强>
好的,你可能已经查看了文档,但我认为你找不到答案 - 因为我没有 - 因为没有简单的答案。但是在这里我的发现有希望总结这些要点(你在下面的MS文档中找不到):
1)我们有ChannelFactory
和IChannel
。 ChannelFactory
知道如何与传输进行通信,并且通道知道如何将参数解释为WCF方法调用和反之亦然。 IChannel
是“实现”(或看起来像实现)服务接口的那个,而ChannelFactory具有所有必要的通信抽象(包括端点,安全性......)。
2)ClientBase
只是ChannelFactory
和IChannel
拼凑在一起。因此很明显,创建一次ChannelFactory然后一遍又一遍地创建频道意味着它更有效率,因为你认为它并不那么容易因为... ...
3)ChannelFactory
一旦打开,就无法更改。这意味着如果您使用用户名密码连接到WCF服务并且用户名密码更改,那么您需要一个新密码。这似乎不是一个大问题,但它在ASP .NET场景中成为一个大问题。
4)ChannelFactory
和IChannel
实际上重用了相同的底层沟通渠道,因此关闭ChannelFactory将使IChannel无效。这会导致清理代码混乱,并决定谁负责关闭连接。
5)如你所见,没有简单的答案。如果您不必在运行时使用用户名/密码或更改配置,请创建并缓存ChannelFactory,然后只创建通道。在任何情况下,ChannelFactory
和IChannel
都比ClientBase
更有效。