WCF ChannelFactory与生成代理应该使用哪一个?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

只是想知道在什么情况下你可以使用ChannelFactory调用调用时,你更愿意从WCF服务中生成代理?

这样就不必生成代理,并担心在更新服务器时重新生成代理?

提问于
用户回答回答于

有三种基本的方法来创建WCF客户端:

  1. 让Visual Studio生成您的代理。这个自动生成通过读取WSDL连接到服务的代码。如果服务因任何原因而更改,则必须重新生成该服务。这样做的一大优点是设置起来很简单 - VS有一个向导,而且全部都是自动的。缺点是你依靠VS为你做了所有的辛苦工作,所以你失去了控制权。
  2. 使用ChannelFactory具有已知的接口。这依赖于你拥有描述服务的本地接口(服务契约)。最大的好处是可以更轻松地管理变更 - 仍然需要重新编译和修复变更,但现在不再重新生成代码,而是引用新的接口。当你控制服务器和客户端时,通常会使用它,因为对于单元测试来说,这两者都可以更容易地进行模拟。然而,可以为任何服务编写接口,甚至是REST接口 - 查看这个Twitter API
  3. 编写你自己的代理 - 这很容易做到,特别是对于REST服务,使用HttpClientor WebClient。这为您提供了最好的谷物控制,但是以大量的服务API为代价。例如:var content = new HttpClient().Get("http://yoursite.com/resource/id").Content;- 如果API的细节发生变化,则直到运行时才会遇到错误。

我个人从来不喜欢选项1 - 依靠自动生成的代码是凌乱的,失去了太多的控制。此外,它经常会产生序列化问题 - 我最终得到两个完全相同的类(一个在服务器代码中,一个是自动生成的),它可以被拖拽但很痛苦。

用户回答回答于

我使用ChannelFactory和MetadataResolver.Resolve方法。客户端配置是一件麻烦事,所以我从服务器上获取我的ServiceEndpoint。

当使用ChannelFactory(Of T)时,T可以是可以从项目中的引用或生成的合同实例中获得的原始合同。在某些项目中,我从Service Reference生成代码,因为我无法添加对合同DLL的引用。甚至可以与服务参考生成异步合同,并使用ChannelFactory的合同接口。

对我来说使用ChannelFactory的主要目的是摆脱WCF客户端配置信息。在下面的示例代码中,可以看到如何在没有配置的情况下实现WCF客户端。

Dim fixedAddress = "net.tcp://server/service.svc/mex"
Dim availableBindings = MetadataResolver.Resolve(GetType(ContractAssembly.IContractName), New EndpointAddress(fixedAddress))
factoryService = New ChannelFactory(Of ContractAssembly.IContractName)(availableBindings(0))
accesService = factoryService.CreateChannel()

在我的最终项目中,检查availableBindings以使用net.tcp或net.pipe(如果可用)。这样,我可以使用最适合我的需求的可用绑定。我只依赖于服务器上存在元数据端点的事实。

顺便说一下,这是使用.NET 3.5完成的。但它也可以与4.0一起工作。

扫码关注云+社区