使用ChannelFactory调用wcf服务有什么好处

时间:2014-01-24 14:04:32

标签: c# wcf proxy

如果我知道服务URL,那么我可以点击添加引用并添加服务URL以在客户端创建代理以使用它但是在客户端没有创建代理我们可以在ChannelFactory的帮助下使用和调用服务。

所以我想知道人们何时会在运行时使用ChannelFactory创建代理并且有什么优势?

如果我想要,如果其他人知道我的服务网址,那么他们也将无法添加我的服务作为添加服务参考....如何启用此功能?如果他们知道我的服务网址,我希望其他人无法在他们的最终创建代理....是否有可能。我希望人们总是必须使用ChannelFactory调用ny服务。请详细讨论这个问题。谢谢

3 个答案:

答案 0 :(得分:1)

我使用ChannelFactory而不是自动生成的代理在服务器端和客户端上使用相同的对象模型。 此处Sharing Interfaces Between a WCF Service and Client (marked w/ ServiceContract)还讨论了自动生成代理的一些问题。

至于隐藏元数据,答案可能在How to hide wsdl information on WCF?

答案 1 :(得分:1)

我通常会创建两个程序集,一个包含服务元数据(Interfaces [服务协定]和数据对象[datacontracts]),另一个包含实际的服务实现。

通常我自我托管wcf服务并跳过没有元数据(创建代理服务器)的客户端所需的DataExchange端点服务。客户端接收我的元数据dll并编写自己的代理,或者使用自定义库和元数据dll来创建代理。两种方法都使用channelfactory来创建代理。 如果在LAN环境中使用服务,我通常会设置一个发现服务,以便客户端可以找到特定服务接口的服务URL(自定义库代码)。

也许我只是老派,但我喜欢控制这个过程。版本控制等等。另一个原因是,当有多种使用技术的方法时,我会专注于能够最了解它的那种方法。

如果您想快速测试服务或者不熟悉WCF编程模型,也许您应该在Visual Studio中使用IIS和服务页面(SVC)以及自动代理创建。如果您编写自己的服务库并需要更细粒度的通信控制(常见服务发现策略,常见配置/通用绑定设置,常见安全设置,挂钩通信堆栈中的事件以运行自定义代码等),请使用Channelfactory。 / p>

答案 2 :(得分:1)

如果您有任何非.NET的客户端(例如Java或PHP),ChannelFactory将不适用于它们,因为它特定于.NET和WCF。在这种情况下,您要么必须发布元数据或向客户端发送WSDL,以便他们可以通过他们选择的语言使用的任何方式创建代理(我不太了解Java,PHP等,所以我可以'说明的话远不止于此。)

至于使用ChannelFactory,我假设您正在谈论ChannelFactory<T>,因为ChannelFactory本身是一个抽象类,无法实例化。使用通道工厂提供了更大程度的控制(正如其他人所指出的那样) - 对于ChannelFactory<T>,客户端将需要服务合同(接口,而不是实现),因此要么使用每个人共享的公共程序集,要么提供与客户的接口是实现这一目标的两种最简单的方法。

您可以在httpGetEnabled标记的配置文件中将<serviceMetadata>变为“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端点应该可以解决问题。