9

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

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

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

_duplexSessionChannel = channelFactory.CreateChannel(endpointAddress);

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

4

4 回答 4

17

主要区别在于:

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

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

第二个重要的点是:

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

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

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

对于大多数第三方服务,您根本没有该选项。

于 2010-02-22T06:05:15.583 回答
3

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

OTOH,这并没有因为 WCF 中的设计缺陷而变得更容易,它阻止了我们可以使用 ASMX 代理进行的 WCF 代理的简单使用:

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

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

于 2010-02-22T04:54:42.647 回答
2

这可能会帮助您:

何时使用代理?

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

何时使用 ChannelFactory?

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

您还可以参考以下链接以了解通道工厂和代理类之间的区别 http://ashishkhandelwal.arkutil.com/wcf/channelfactory-over-proxy-class-in-wcf/

于 2012-06-21T17:41:29.377 回答
1

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

于 2014-04-27T07:02:50.347 回答