【问题标题】:Referencing with WCF Webservice使用 WCF Web 服务进行引用
【发布时间】:2016-02-27 20:20:28
【问题描述】:

我以前使用过网络服务并且理解这个概念。但是现在我已经建立了一个 WCF Webservice,但是我对它的使用有疑问。 (教程的设置方式。)

我设置了以下内容:

  • WCF 服务库(称为 CalculatorService)
  • 服务主机(称为CalculatorServiceHost)
  • 服务代理(称为CalculatorServiceProxy,正在使用ClientBase)
  • 服务客户端(称为CalculatorServiceClient)

我的理解如下;

  1. 服务库包含可在 Web 服务中使用的服务/对象。可以说它是一个带有方法添加的计算器。
  2. Host 使此类及其功能可用于客户端。
  3. 代理从客户端向配置的端点发送和接收消息。
  4. 客户端可以通过代理从服务中调用函数。

本教程设置代理如下:

public class MyCalculatorServiceProxy : ClientBase<ICalculator>, ICalculator {
    public int Add(int num1, int num2){
        return base.Channel.Add(num1, num2);
    }
}

这意味着在代理中我必须至少引用包含 ICalculator 的程序集。如果缺少对同一程序集的引用,客户端还会抱怨没有对接口的引用。

在本教程中,接口和继承该接口的类/服务位于同一个程序集中。因此,在客户端引用接口的程序集意味着您还可以创建“计算器”类的实例,甚至不需要 WCF 服务来调用函数。

这是否意味着您总是需要两个带有 WCF 服务的程序集。一个带有接口,一个带有类/服务?

如果我错了或者如果有人有一些额外的信息/cmets,请纠正我。

【问题讨论】:

  • 是的,基本上您应该始终将合同和运营事项分开。合约是接口、请求和响应
  • 不,您可以在同一个程序集中拥有服务合同和服务实现。有时将它们分开很有用——例如,在工作中,我们将服务合同(接口)放在一个单独的程序集中。这允许客户端引用程序集并使用ChannelFactory&lt;T&gt; 为客户端生成代理。但是将它们都放在一个程序集中是完全合法的。
  • 不需要引用计算器程序集,可以使用wsdl生成代理。或者,如果 wcf 服务公开了元数据,您可以添加 Web 引用,它将创建代理。但我建议将合同和 poco 类分离到它们自己的程序集中,以便在客户端和服务器中引用。
  • @Tim 但我想知道的是,如果您引用带有服务合同和实现的程序集。为什么通过代理在 Web 服务上使用服务。是否可以通过其他程序集的引用立即调用函数?
  • @JanneMatikainen 我查看了它并确实通过服务引用 (WSDL) 创建了代理,而不是通过程序集引用。那行得通,但必须在元数据上设置策略版本!谢谢,这就是我要找的。 (您能否将您的评论改写为答案,以便我接受!)

标签: c# .net web-services wcf


【解决方案1】:

@Tim 但我想知道的是,如果您使用 服务合同和实施。为什么使用服务而不是 通过代理的网络服务。如果您可以立即调用函数 通过其他程序集的引用?

如果你这样做了,那么你就不是让一个服务与你的数据库通信(例如),而是让该服务的每个可能的客户端都与你的数据库通信。你到处都有连接字符串。如果您需要修改服务代码,则必须将更新部署到更多应用程序。您将失去安全性、可扩展性和可维护性。

但这对于编写单元和集成测试非常有用。

【讨论】:

  • 这不是我的评论。我的评论是关于拥有私有代码,并且不想与客户共享它。这可以通过网络服务来完成。但是我的问题是,如果您必须引用它并且可以立即调用它,为什么要这样做。然而 JanneMatikainen 给出了很好的答案/建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多