代码改变世界

WCF 第二章 契约

2011-06-23 20:44  DanielWise  阅读(1417)  评论(0编辑  收藏  举报

  在原子和金钱世界中,契约是两个或多个组织以一个已知的价格提供商品和服务的合同。在比特和服务的世界中,契约有类似的功能:它是两个或多个组织之间确定消息交换和消息条款及条件的合同。

   契约是由服务终结点发送或接收的消息的描述。每一个终结点都由ABCs定义:一个消息发送到的网络上的地址,一个描述消息如何发送的绑定,一个描述消息格式的契约。

  记住服务实际上是终结点集合,终结点用代码实现了特殊算法。它们可以实现高级别的商业功能,比如进入一个订单履行系统,或者可以更细粒度,比如寻找客户的地址。高级功能一般需要复杂的数据结构,而针对性的功能通常需要更多基本数据类型。在任何一种情况下,终结点必须确认它要完成的操作和它期望的数据格式。它们一起构成了契约。

WCF中三种类型的契约:

  服务契约。服务契约描述了服务的功能性操作的实现。服务契约将.NET类型中的类方法映射成WSDL服务,端口类型和操作。在服务契约中的操作契约描述服务操作,服务契约是用来描述服务功能的方法。

  数据契约。数据契约描述了被服务端用来与客户端通信的数据结构。数据契约将CLR类型映射成XML元数据定义(XSD)而且定义了它们如何序列化和反序列化。数据契约描述了由服务操作发送和接收的所有数据。

  消息契约。消息契约将CLR类型映射成SOAP消息而且描述了SOAP消息格式并影响消息中WSDL和XSD的定义。消息契约提供了对SOAP消息头和消息体的精确控制。

   为了使契约可以再最广泛的系统之间共用,它们被使用网络服务描述语言(WSDL)表达。所以,在继续进行更加深入的契约讨论之前,对WSDL进行一个间断的介绍是有帮助的。根据W3C的标准,行业供应商(Microsoft, IBM, 等等)定义了WSDL规范。

WSDL是一种用于描述作为一个端点对包含任何面向文档或程序为导向的信息服务,网络服务设置的XML格式。操作和消息被抽象的描述,然后绑定到一个具体的网络协议和消息格式来定义一个终结点。相关具体的终结点与抽象终结点(服务)连接到一起。WSDL可以扩展描述终结点和消息而不必考虑通信中的消息格式或者网络协议;然而,文档中唯一描述的绑定是关于如何使用WSDL与SOAP 1.1,HTTP GET/POST和MIME进行连接。

   详细说明在www.w3.org/TR/wsdl, 描述了关键概念和支持细节以便于厂商如微软可以生成工具来生成和使用WSDL。主要的WSDL组成在表2.1中介绍,从公开规则中介绍和扩展。

表2.1 WSDL组成 
 
   因为契约以WSDL和XSD描述的但是代码一般都是使用CLR类型,这需要在两种系统之间有一个映射。WCF用三个过程来使映射更加便利。首先,当写服务端代码时,你使用WCF定义属性[SeviceContract],[OperationContract],[FaultContract],[MessageContract]和[DataContract].当写客户端代码时,你会查询服务来了解契约细节并生成一个代理类来暴露一个可以从代码中调用的服务接口。这是使用Visual Studio 或者svcutil.exe,调用服务中的元数据结构终结点来从属性定义的代码产生WSDL.最后,当一个客户端在运行时调用服务接口中的方法,WCF把CLR类型和方法调用序列化成XML然后根据WSDL中约定的绑定和编码计划来在线上传输消息。
 
   这里总共有四个结构;两个在.NET两个在XML。在.NET中,一个CLR类型定义数据结构或者作用,但是除非那个类型的对象被初始化否则不能做任何事。在XML中,一个XSD定义数据结构,但是除非一个XML实例被创建否则没有任何实际消息存在。
 
   所以为了恰当的了解WCF是怎样工作的,你需要了解代码和WCF。幸运的是,WCF提供了必要的工作来映射它们。第一个工具,SvcUtil.exe,可以从命令行被显示的调用或者隐式的通过Visual Studio添加服务引用调用。这个工具,有很多功能,产生WSDL并生成代理类来实现.NET类型和XSD之间的映射,还有.NET类方法和WSDL操作。第二个工具,服务跟踪查看器,或者SvcTraceViewer.exe,是一个图形化工具,可以读取并理解WCF生成的诊断日志文件。使用这个工具,我们可以查看终结点接收到的和发送出的消息格式,并可以跟踪消息流。这个工具在第九章详细介绍,“诊断”。
 
   在这一章我们将介绍如何使用五分之四的契约类型。我们将从查看暴露终结点和定义方法的操作契约的服务契约开始。然后我们将检查描述终结点数据传入传出的数据契约。最后,我们将描述提供对SOAP消息更多控制的消息契约。在这本书的接下来章节我们将讨论错误契约,在第十章,“错误处理”。