【问题标题】:what is the advantage of using ChannelFactory to call wcf service使用ChannelFactory调用wcf服务有什么好处
【发布时间】:2014-01-24 14:04:32
【问题描述】:

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

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

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

【问题讨论】:

  • "如果其他人知道我的服务 url,那么他们将无法将我的服务添加为添加服务参考 [...] 我希望其他人无法在如果他们知道我的服务 url,他们就结束了” - “添加服务引用”也会生成一个代理。你似乎问错了问题。你想做什么?根据您的问题历史,我强烈建议您选择 WCF 书籍或学习课程,因为您似乎难以掌握最基本的概念。

标签: c# wcf proxy


【解决方案1】:

如果您有任何不是 .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 端点应该可以解决问题。

【讨论】:

    【解决方案2】:

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

    至于隐藏元数据,答案大概在这里How to hide wsdl information on WCF?

    【讨论】:

    • 我在这里问了这个问题,但没有回答。我希望如果其他人知道我的服务网址,那么他们也将无法将我的服务添加为添加服务参考....如何启用此功能?我希望其他人如果知道我的服务 url 将无法在他们的末尾创建代理....有可能吗?请看一下
    【解决方案3】:

    我通常创建两个程序集,一个带有服务元数据(接口 [服务合同] 和数据对象 [datacontracts]),另一个带有实际的服务实现。

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

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

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

    【讨论】:

    • 我在这里问了这个问题,但没有回答。我希望如果其他人知道我的服务网址,那么他们也将无法将我的服务添加为添加服务参考....如何启用此功能?我希望其他人如果知道我的服务 url 将无法在他们的末尾创建代理....有可能吗?请看一下
    • 您必须添加一个元数据交换端点,这可以通过代码或配置(在服务器上)来完成。 jeffbarnes.net/blog/post/2006/10/16/…
    • 也许我误解了这个问题,您必须添加元数据交换端点以使客户端能够自动创建服务代理(和数据对象)。如果您不希望他们这样做,那么就不要添加元数据交换端点
    • 如果不添加元数据交换端点,那么客户端将能够使用服务吗?
    • 是的,但他将无法使用 Visual Studio 中的服务引用从服务合同创建代理和数据对象。客户端需要通过其他方式(例如接收带有服务合同和数据合同的 DLL)了解 SOAP 操作(和参数)的外观
    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多