![](/img/trans.png)
[英]How do I call WCF service.Abort() when service was creating using spring.net wcf:channelfactory
[英]what is the advantage of using ChannelFactory to call wcf service
如果我知道服务URL,则可以单击添加引用并添加服务URL以在客户端创建代理以使用它,但是无需在客户端创建代理,我们可以在ChannelFactory的帮助下使用和调用服务。
所以我想知道人们何时会在运行时使用ChannelFactory创建代理,这有什么好处?
如果我想让其他人知道我的服务网址,那么他们也将无法将我的服务添加为添加服务参考。...如何启用此功能? 我希望其他人如果知道我的服务网址,将无法在其末尾创建代理。 我希望人们总是必须使用ChannelFactory来调用ny服务。 请详细讨论此问题。 谢谢
我使用ChannelFactory而不是自动生成的代理在服务器端和客户端上使用相同的对象模型。 同样在这里, 在WCF服务和客户端之间共享接口(标记为ServiceContract)与自动生成的代理有关的一些问题也被讨论了。
至于隐藏元数据,答案可能就在这里。 如何在WCF上隐藏wsdl信息?
我通常创建两个程序集,一个使用服务元数据(接口[服务合同]和数据对象[datacontracts]),另一个使用实际的服务实现。
通常,我会自行托管wcf服务,并跳过没有元数据的客户端所需的DataExchange端点服务(用于创建代理)。 客户端接收我的元数据dll并编写自己的代理,或将自定义库与元数据dll一起使用以创建代理。 两种方法都使用channelfactory创建代理。 如果在LAN环境中使用服务,我通常会设置发现服务,以便客户端可以找到特定服务接口(自定义库代码)的服务url。
也许我只是个老派,但我喜欢对过程进行控制。 版本问题等等。 另一个原因是,当使用一种以上的技术方式时,我将重点放在最能从中学习到有关技术的方式上。
如果要快速测试服务或对WCF编程模型不满意,也许应该在Visual Studio中使用IIS和服务页面(SVC)以及自动代理创建。 如果您编写自己的服务库并且需要更细粒度的通信控制(公共服务发现策略,公共配置/公共绑定设置,公共安全设置,挂接到通信堆栈中的事件以运行自定义代码等),请使用Channelfactory。
如果您有不是.NET的任何客户端(例如,像Java或PHP), ChannelFactory
将不适用于它们,因为该客户端特定于.NET和WCF。 在那种情况下,您要么必须发布元数据,要么向客户端发送WSDL,以便他们可以通过他们选择的语言使用的任何方式来创建代理(我对Java,PHP等不是很了解,所以我可以)不能说那么多)。
至于使用ChannelFactory
,我假设您正在谈论ChannelFactory<T>
,因为ChannelFactory
本身是一个抽象类,无法实例化。 使用Channel Factory可以提供更大程度的控制(如其他人所指出的)-对于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端点即可解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.