2014-01-24 34 views
0

如果我知道服务url然后我可以点击添加引用并添加服务url在客户端创建代理来使用它,但不在客户端创建代理我们可以在ChannelFactory的帮助下使用和调用服务。使用ChannelFactory调用wcf服务的好处是什么

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

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

+0

_“如果其他人知道我的服务网址,那么他们将无法添加我的服务作为添加服务引用[...]我希望其他人无法在其最终创建代理服务器,如果他们知道我的服务url“_ - **”Add Service Reference“也会生成一个代理**。你似乎在问错误的问题。你想做什么?从您的问题历史中,我强烈建议您选择一本WCF书籍或学习课程,因为您似乎无法理解最基本的概念。 – CodeCaster

回答

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端点应该做的伎俩。

1

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

至于隐藏的元数据,答案很可能是这里How to hide wsdl information on WCF?

+0

我在这里问这个问题,但也没有回答。我希望如果其他人知道我的服务网址,那么他们也将无法添加我的服务作为添加服务引用....如何启用此功能?我希望其他人不能在他们的最后创建代理,如果他们知道我的服务网址....是可能的。请看看 – Thomas

1

我通常会创建两个组件,一个与服务元数据(接口[服务合同]和数据对象[datacontracts])和一个与实际服务实现。

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

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

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

+0

我在这里问这个问题,但没有回答。我希望如果其他人知道我的服务网址,那么他们也将无法添加我的服务作为添加服务引用....如何启用此功能?我希望其他人不能在他们的最后创建代理,如果他们知道我的服务网址....是可能的。请看看 – Thomas

+0

您必须添加元数据交换端点,这可以通过代码或配置(在服务器上)完成。 http://jeffbarnes.net/blog/post/2006/10/16/metadata-exchange-endpoint.aspx – Frode

+0

也许我误解了这个问题,您必须添加元数据交换端点以使客户端能够自动创建服务代理(和数据对象)。如果你不想要他们,那么只要不添加元数据交换端点 – Frode

相关问题