使用WCF服务的客户端是否需要接口定义?

时间:2010-12-12 20:39:24

标签: wcf web-services cross-platform

我一直在阅读“学习WCF”一书,试图了解创建和使用WCF Web服务。本书的第一部分引导读者创建并使用简单的“Hello World”Web服务。

我遇到的问题是客户端应用程序在调用它时似乎不知道WCF接口的结构。如果可以从任意数量的编程语言调用Web服务,这怎么可能是必要的呢?

我在下面列出了相关的示例代码......

以下是界面的代码

 [ServiceContract(Namespace="http: //www.thatindigogirl.com/samples/2006/06")]
 public interface IHelloIndigoService
 {
  [OperationContract]
  string HelloIndigo();
 }

以下是托管网络服务的服务的代码

static void Main(string[] args)
{
  using (ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService) ,
    new Uri("http: //localhost: 8000/HelloIndigo")))
  {
    host. AddServiceEndpoint(typeof(HelloIndigo. IHelloIndigoService) ,
      new BasicHttpBinding(), "HelloIndigoService");
    host. Open( );
    Console. WriteLine("Press <ENTER> to terminate the service host") ;
    Console. ReadLine();
  }
}

以下是使用WCF服务的客户端应用的代码   这是我感到困惑的地方。由于此客户端应用程序可以是任何能够调用Web服务的语言,为什么需要知道接口的定义?

using System. ServiceModel;
[ServiceContract(Namespace = "http: //www.thatindigogirl.com/samples/2006/06")]
public interface IHelloIndigoService
{
  [OperationContract]
  string HelloIndigo( );
}

static void Main(string[ ] args)
{
 EndpointAddress ep = new
   EndpointAddress("http: //localhost: 8000/HelloIndigo/HelloIndigoService") ;
 IHelloIndigoService proxy = ChannelFactory<IHelloIndigoService>.
   CreateChannel(new BasicHttpBinding(), ep);

 string s = proxy. HelloIndigo();
 Console. WriteLine(s) ;
 Console. WriteLine("Press <ENTER> to terminate Client.") ;
 Console. ReadLine();
}

我在这里错过了一个重点吗?也许我缺乏对消费网络所需要的理解。我的目标是能够使用WCF创建可以从任何编程语言或环境调用的.NET服务。

可能有人建议在.NET中创建“跨平台可消耗”Web服务的好教程吗?谢谢!

4 个答案:

答案 0 :(得分:2)

这种方法基于共享接口(该书实际上不共享接口,而是使用本地副本),并成功应用于客户端和服务器都是用.NET编写的环境中。此方法不适用于互操作性或SOA解决方案。

其他方法使用服务公开的元数据。元数据被定义为WSDL文档和几个XSD文档。这些元数据文件是向.NET和非.NET开发人员提供有关服务的信息的方法。本书包含元数据(mex)端点的定义,因此您肯定会读到这一点。

在.NET中使用元数据意味着创建服务代理。您可以使用Visual Studio的添加服务引用或命令行实用程序svcutil.exe自动执行此操作。无论如何生成的代理代码可能仍然包含从元数据创建的接口。它用于为客户端创建透明的服务抽象。

答案 1 :(得分:2)

'接口'并不意味着.NET接口文件,它意味着更通用的编程接口 - 具有属性的一组对象和带参数的方法。这也称为服务合同。

当您考虑接口时,客户端和服务需要共享(即两者都知道)接口的原因很简单 - 如果客户端不知道接口,他们如何知道可用的操作以及什么预期的请求/响应对象应该是什么样的?

答案 2 :(得分:1)

每个WCF服务都由

组成
  • A - 地址
  • B - 绑定
  • C - 合同

使用服务器端的接口声明合同。它声明客户端可以使用哪些方法。如果您使用的是http绑定,则可以通过发出http请求(使用任何库或语言中的http客户端 - 甚至Web浏览器)指向正确的地址来调用服务操作。所以客户端根本不需要任何接口引用。它只需要遵循服务的ABC

Here是关于WCF和Java互操作性的不错的博客。

答案 3 :(得分:1)

要回答有关如何开发“跨平台耗材”Web服务的问题,请考虑使用REST方法。制作REST风格的Web服务确实使它们独立于消耗它们的平台。简而言之,他们使用已经完善的HTTP协议,一切都支持:GET和POST Http方法。

然后,您可以使用Java应用程序,只需在有效负载中使用您自己的自定义XML内容对您的WCF服务进行POST调用,而无需使用诸如制作SOAP包装等更复杂的内容。查看Rob Bagby关于REST的文章:

http://www.robbagby.com/rest/rest-in-wcf-part-i-rest-overview/