0

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

其他问题已经问过这个问题:WCF/Silverlight:为什么使用 ChannelFactory 而不是 Client?

但是,响应只是说最好重新使用 ChannelFactory。但如果直接这样做,您将失去生成的 WCF 服务客户端的所有其他功能(异步事件等)

有没有办法让生成的 WCF 服务客户端重新使用 ChannelFactory 本身?

4

1 回答 1

0

WCF惨败

START_RANT

甚至 Microsoft 和 WCF 团队都知道,由于各种性能问题而设计的方式和ChannelFactory方式以及更改方式是一场真正的惨败。仅仅代理的处理是一个真正的混乱就足以知道在 WCF 的可扩展性之下,我们正在处理一个低效、臃肿和复杂的设计。只是坏坏坏。ChannelClientBase

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

于 2011-02-18T15:58:52.670 回答