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