上面关于WCF中数据契约、服务契约、消息契约的文章概括了很多与契约相关的技术点。这些技术点对于跨平台互操作来说是基础。契约精确描述了一个服务可以理解的消息。
WCF高度利用了SOAP契约的定义。具体来说,它使用的是描述服务端点的WSDL和描述数据的XSD。WSDL中定义的服务操作是用来在运行时识别传入的消息为正确的.NET类。同样的,XSD契约定义的XML文档也被描述为.NET类型然后传递给运行时的服务操作。总的来说,WSDL和XSD定义提供一种.NET类型的基于标准的表现形式以便应用在服务的实现中。
契约的三种类型定义如下:
服务契约:服务契约描述服务中实现的方法和操作。
数据契约:数据契约描述服务端通信时所传递的数据结构。一个数据契约可以序列化CLR类型为XML,然后严格筛选他们的数据成员。
消息契约:消息契约包含类型化和非类型化的数据,并且提供对SOAP消息头和消息体的精确控制。
服务契约:
服务契约定义了服务的操作——即在服务的类接口中暴露的方法。他们提供了一个正式的WSDL接口给服务。服务契约由[ServiceContract]和[OperationContract]属性。操作的名字们来源于类和方法的名字,但是党定义属性时也可以被重写。服务契约提供三种消息交换的模式:请求-响应,单向和复合式。
请求相应的操作契约会在客户端等待服务操作执行完成并重新获得自身执行控制之前阻塞客户端进程。因此,服务契约应该只适用于比较快的服务调用,因为客户会愿意等待这样的响应。在客户端,.NET异步模式可以用在请求响应消息交换模式中,以防止服务端长时间运行请求时客户端造成阻塞。
单向模式的操作契约,如他的名字描述的这样,单向;他们不会返回结果给客户端。服务操作必须有一个返回类型为void以及[OperationContract]属性被标记为[IsOneWay=true]的方法。单向契约在许多传输上实现,包括消息队列。
复合式操作契约提供最大的灵活性和性能,因为他们在客户端和服务端之间分离请求和响应的执行。在服务端和客户端之间建立双工通道后,客户端或服务端都可以初始化消息。这种模式更适合由客户端发起。
数据契约:
数据契约定义了应用程序到服务端的数据接口。服务契约的表现形式——WSDL中的XML结构定义中包含着一种类,这种类标记有[DataContract]和[DataMember]属性。其他数据类型也可以暴露在WSDL中,如那些标记有[Serialiazble]属性的基础类型。因为[DataContract]为跨平台间的互操作提供了序列化角色设计,它是WCF的首选序列化机制。
标记有[DataMember]属性的类成员会包含在数据契约中。这是严格意义上的选择模式,因此只有标记了该属性的成员才可包含在契约中。这也就使[DataContract]属性比[Serializable]属性更适合序列化的机制,因为后者会导致内部结构被暴露到服务外。
类的层次结构也是支持的,而且他们的命名空间也可以通过层次结构展示。为了支持多态和包含对象的集合,WCF可以让一个服务公开已知类型的列表。数据契约也设计有版本。当新的成员被按照一定的规则添加到契约后,其他的客户端将会继续工作。
消息契约:
消息契约时一种可以访问SOAP头和体内容的操作契约。消息可以使用[DataContract]或[Serializable]类型化,或者他们可以是简单的类型Message。类型化消息使用[MessageHeader]和[MessageBody]属性标记。消息数据可以不在设计时定义,可以实现最大灵活性。非类型化消息也可以访问SOAP消息的头和体。