直接频道使用与使用代理?

时间:2010-02-22 04:51:12

标签: wcf proxy channel channelfactory

正如标题所暗示的那样,我试图了解为什么在WCF中有时人们选择“生成代理”而不是使用ChannelFactory来手动创建新的通道实例。我已经看过每个例子,但是没有真正找到任何解释为什么你会选择一个与另一个。

说实话,我只使用过频道和我继承的代码中的ChannelFactory<T>,即:

IChannelFactory<IDuplexSessionChannel> channelFactory =
    binding.BuildChannelFactory<IDuplexSessionChannel>();

_duplexSessionChannel = channelFactory.CreateChannel(endpointAddress);

那我为什么要“生成代理”呢?有什么好处和缺点?

4 个答案:

答案 0 :(得分:17)

主要区别在于:

  • 生成代理只需要知道服务所在的URL。通过生成代理,其他所有内容(服务合同和涉及的数据合同)将通过检查服务的元数据来确定

  • 要直接创建ChannelFactory<T>,您必须能够直接访问包含要为其生成渠道工厂的服务合同T的程序集。只有在基本上控制通道的两端并且您可以共享包含这些服务合同的程序集时,这才有效。通常,对于第三方服务,情况并非如此 - 使用您自己的服务,是的。

第二个重点是:

  • 创建一个生成的代理基本上完成了你要做的两个步骤 - 创建一个ChannelFactory<T>,然后在一个构造函数中创建实际的通道。你无法控制这两个步骤。

  • 创建自己的频道是有益的,因为创建ChannelFactory<T>是一个昂贵的步骤 - 所以你可以在某处缓存你的频道工厂实例。从工厂创建和重新创建实际渠道的步骤更少,您可以更频繁地执行

因此,如果您确实控制了通信,服务和客户端的两端,您可以选择在单独的程序集中共享服务合同,从而获得更多选项。

对于大多数第三方服务,您只是没有这个选项。

答案 1 :(得分:3)

使用代理更简单,更容易理解。你可以处理简单的事情 - 这些类的类和方法 - 而不是复杂的,与网络相关的事情,如频道。

OTOH,WCF中的设计缺陷使得这一点不容易,因为我们可以使用ASMX代理来防止同样简单地使用WCF代理:

using (var client = new MyServiceClient())
{
}

如果将此模式与WCF一起使用,则由于异常而退出块时可能会丢失原始异常。 client.Dispose()可以抛出异常,这将覆盖最初抛出的异常。需要更复杂的模式。

答案 2 :(得分:2)

这可能会对您有所帮助:

何时使用代理?

如果您拥有的服务会被多个应用程序使用,或者通用性足以在多个地方使用,那么您将需要使用代理类。

何时使用ChannelFactory?

ChannelFactory类用于在客户端和服务之间构建通道,而无需代理。在某些情况下,您可能拥有与客户端应用程序紧密绑定的服务。在这种情况下,您可以直接引用接口DLL并使用ChannelFactory使用它来调用您的方法。

您还可以参考以下链接来了解Channel Factory和Proxy类之间的区别 http://ashishkhandelwal.arkutil.com/wcf/channelfactory-over-proxy-class-in-wcf/

答案 3 :(得分:1)

channelFactory的主要优点是您可以动态地在运行时创建代理。使用SvcUtil(在VS中添加Web引用),您可以在设计时创建代理,因此它的实现更加静态。