【发布时间】:2016-02-27 20:20:28
【问题描述】:
我以前使用过网络服务并且理解这个概念。但是现在我已经建立了一个 WCF Webservice,但是我对它的使用有疑问。 (教程的设置方式。)
我设置了以下内容:
- WCF 服务库(称为 CalculatorService)
- 服务主机(称为CalculatorServiceHost)
- 服务代理(称为CalculatorServiceProxy,正在使用ClientBase)
- 服务客户端(称为CalculatorServiceClient)
我的理解如下;
- 服务库包含可在 Web 服务中使用的服务/对象。可以说它是一个带有方法添加的计算器。
- Host 使此类及其功能可用于客户端。
- 代理从客户端向配置的端点发送和接收消息。
- 客户端可以通过代理从服务中调用函数。
本教程设置代理如下:
public class MyCalculatorServiceProxy : ClientBase<ICalculator>, ICalculator {
public int Add(int num1, int num2){
return base.Channel.Add(num1, num2);
}
}
这意味着在代理中我必须至少引用包含 ICalculator 的程序集。如果缺少对同一程序集的引用,客户端还会抱怨没有对接口的引用。
在本教程中,接口和继承该接口的类/服务位于同一个程序集中。因此,在客户端引用接口的程序集意味着您还可以创建“计算器”类的实例,甚至不需要 WCF 服务来调用函数。
这是否意味着您总是需要两个带有 WCF 服务的程序集。一个带有接口,一个带有类/服务?
如果我错了或者如果有人有一些额外的信息/cmets,请纠正我。
【问题讨论】:
-
是的,基本上您应该始终将合同和运营事项分开。合约是接口、请求和响应
-
不,您可以在同一个程序集中拥有服务合同和服务实现。有时将它们分开很有用——例如,在工作中,我们将服务合同(接口)放在一个单独的程序集中。这允许客户端引用程序集并使用
ChannelFactory<T>为客户端生成代理。但是将它们都放在一个程序集中是完全合法的。 -
不需要引用计算器程序集,可以使用wsdl生成代理。或者,如果 wcf 服务公开了元数据,您可以添加 Web 引用,它将创建代理。但我建议将合同和 poco 类分离到它们自己的程序集中,以便在客户端和服务器中引用。
-
@Tim 但我想知道的是,如果您引用带有服务合同和实现的程序集。为什么通过代理在 Web 服务上使用服务。是否可以通过其他程序集的引用立即调用函数?
-
@JanneMatikainen 我查看了它并确实通过服务引用 (WSDL) 创建了代理,而不是通过程序集引用。那行得通,但必须在元数据上设置策略版本!谢谢,这就是我要找的。 (您能否将您的评论改写为答案,以便我接受!)
标签: c# .net web-services wcf