如果我知道服务URL,那么我可以单击添加引用并添加服务URL以在客户端创建代理以使用它,但不在客户端创建代理,我们可以在ChannelFactory的帮助下使用和调用服务。
所以我想知道人们什么时候会去使用 ChannelFactory 在运行时创建代理,有什么优势?
如果我希望其他人知道我的服务 URL,那么他们也无法将我的服务添加为添加服务引用......如何启用此功能?我希望其他人如果知道我的服务 URL,将无法在他们的终端创建代理......可能吗。我希望人们总是必须使用ChannelFactory调用NY服务。请详细讨论此问题。谢谢
如果您有任何不是 .NET 的客户端(例如 Java 或 PHP),ChannelFactory
将不适用于它们,因为它特定于 .NET 和 WCF。 在这种情况下,您要么必须发布元数据,要么向客户端发送 WSDL,以便他们可以通过他们选择的语言使用的任何方式创建代理(我对 Java、PHP 等了解不多,所以我不能明确地说更多)。
至于使用ChannelFactory
,我假设你说的是ChannelFactory<T>
,因为ChannelFactory
本身是一个抽象类,不能实例化。 使用通道工厂可以提供更大程度的控制(如其他人所指出的) - 对于ChannelFactory<T>
,客户端将需要服务协定(接口,而不是实现),因此使用每个人共享的公共程序集或向客户端提供接口是实现此目的的两种最简单的方法。
您可以通过在配置文件的<serviceMetadata>
标记中将httpGetEnabled
转换为"false"来禁用发布元数据 (WSDL):
<system.serviceModel>
<behaviors>
<serviceBehavior>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="false" />
</behavior>
</serviceBehavior>
</behaviors>
</system.serviceModel>
然后,通过将终结点元素的behaviorConfiguration
属性设置为"MyServiceBehavior"来引用此行为。
您还应该删除任何mex
终结点,因为(根据我的理解)这是 Web 服务公开其元数据的一种新方法。 如果未公开元数据,则客户端无法通过 WSDL 构造代理,并且必须通过其他方法构造代理。 特别是 .NET 客户端将无法使用"添加服务引用"。
最后,如果您担心对服务的访问,您应该真正实现某种身份验证方案。 如果您只想禁用发布(公开)元数据,则将httpGetEnabled
设置为 false 并删除任何 mex 端点应该可以解决问题。
我使用 ChannelFactory 而不是自动生成的代理在服务器端和客户端使用相同的对象模型。 此外,此处还讨论了在 WCF 服务和客户端之间共享接口(标记为 w/服务协定),讨论了自动生成代理的一些问题。
至于隐藏元数据,答案可能在这里 如何在 WCF 上隐藏 wsdl 信息?
我通常创建两个程序集,一个包含服务元数据(接口 [服务协定] 和数据对象 [数据协定]),另一个包含实际的服务实现。
通常,我会自托管 wcf 服务,并跳过没有元数据(创建代理)的客户端所需的 DataExchange 端点服务。客户端接收我的元数据 dll 并编写自己的代理,或者使用自定义库和元数据 dll 来创建代理。这两种方法都使用通道工厂来创建代理。 如果在 LAN 环境中使用服务,我通常会设置发现服务,以便客户端可以找到特定服务接口(自定义库代码)的服务 URL。
也许我只是老派,但我喜欢控制这个过程。版本控制问题等。另一个原因是,当有多种方法可以使用一项技术时,我会专注于最能让我了解它的方法。
如果要快速测试服务或不熟悉 WCF 编程模型,也许应该在 Visual Studio 中使用 IIS 和服务页 (SVC) 和自动代理创建。如果您编写自己的服务库并且需要更细粒度的通信控制(通用服务发现策略、通用配置/通用绑定设置、常见安全设置、挂钩到通信堆栈中的事件以运行自定义代码等),请使用 Channelfactory。