代码改变世界

WCF介绍

2013-03-26 20:42  Keiven_LY  阅读(330)  评论(0)    收藏  举报
 图2.1:使用WCF实现相同机器通信
图2.2:使用WCF实现不同机器通信
 
2.1  WCF的基本概念

WCF的三大核心是ABC,也就是

A代表Address-where(对象在哪里)

B代表Binding-how(通过什么协议取得对象)
C代表Contract(契约)-what(定义的对象是什么,如何操纵)

Address:是Endpoint的网络地址,它标记了消息发送的地址。

Binding:描述的是如何发送消息,例如消息发送的传输协议(如TCP,HTTP),安全(如SSL,SOAP消息安全)。

Contract:则描述的是消息所包含的内容,以及消息的规范和操作方式

 
WCF程序分为4部分:契约、服务、宿主、客户端
 
契约

WCF的所有服务都会公开为契约(Contract)。契约与平台无关,是描述服务功能的标准方式。WCF定义了四种类型的契约。

服务契约(Service Contract)

       服务契约描述了客户端能够执行的服务操作。

数据契约(Data Contract)

       数据契约定义了与服务交互的数据类型。WCF为内建类型如int和string隐式地定义了契约;我们也可以非常便捷地将定制类型定义为数据契约。

错误契约(Fault Contract)

       错误契约定义了服务抛出的错误,以及服务处理错误和传递错误到客户端的方式。

消息契约(Message Contract)

       消息契约允许服务直接与消息交互。消息契约可以是类型化的,也可以是非类型化的。如果系统要求互操作性,或者遵循已有消息格式,那么消息契约会非常有用

服务

个标记了[servicecontract]的类

  WCF中的服务具有一个或多个终结点(endpoint)。终结点相当于端口,用于通信。

终结点主要由地址、绑定、契约三个部分组成。

地址(Address): 在哪里(也含有传输方式信息)。它是endpoint的网络地址,它标记了消息发送的目的地。

绑定(Binding) :怎么做(与地址的传输方式要匹配)。它描述的是如何发送消息,如传输协议(tcp/http),安全(ssl/soap)。

契约(Contract):做什么(服务契约)。描术的是消息所包含的内容,以及消息的组织和操作方式,如one-way,duplex和request/reply

服务宿主

服务宿主是服务建好后需要启动它,这个启动的平台称为服务宿主。在宿主中,处理通信是由行为(behavior)的控制点(control point)来决定

是wcf service运行的环境。 可以是asp.net,可以是 windows service,也可以是一个普通的应用程序,例如控制台程序,Windows窗体应用程序

客户端

  只需要引用WCF发布的服务即可。
 
2.2  消息交换模式message exchange patternsmeps

 wcf 中,服务端与客户端之间消息的交换共有三种模式:request/reply,one-way,duplex。

1、request/reply

这是默认的一种消息交换模式,客户端调用服务方法发出请求(request),服务端收到请求后,进行相应的操作,然后返回一个结果值(reply) 
如果没有其它特别的设置,一个方法如果标
记了 operationcontract,则该方法的消息交换模式就是采用的 request/reply方式, 即使它的返回值是 void

2、one-way(单工模式)

如果消息交换模式为 one-way,则表明客户端与服务端之间只有请求,没有响应。即使响应信息被发出,该响应信息也会被忽略。这种方式类似于消息的通知或者广播。当一个服务方法被设置为 one-way 时,如果该方法有返回值,会抛出invalidoperationexception 异常。

要将服务方法设置为 one-way 非常简单,只需要将 operationcontract的属性isoneway设置为true就可以了,如[operationcontract(isoneway=true)] 。

3、duplex(双工模式)

duplex 消息交换模式具有客户端与服务端双向通信的功能,同时它的实现还可以使消息交换具有异步回调的作用。 
要实现消息交换的duplex,相对比较复杂。它需要定义两个接口,其中服务接口用于客户端向服务端发送消息,而回调接口则是从服务端返回消息给客户端,它是通过回调的方式来完成的。

服务类的标记类型用[servicecontract],类中的方法标记类型用 [operationcontract]。
数据类的标记类型用[datacontract],类中的属性用[datamember]

A、服务类中的operationcontract和数据类中的datamember一样,与它的访问限制修饰符(public,internal,private等)没有直接关系。即使该成员为 private,只要标记了operationcontract/datamember,仍然可以被调用/序列化(被施加到 static 成员,wcf 会忽略该datamember)

B、如果datacontract类中的 datamember成员包含了泛型,那么泛型类型参数必须支持序列(基本类型,如int,可以被序列化)。

C、在datamember中,提供了 order属性,用以设置序列化后的xml的成员的顺序,如 [datamember(order = 1)] public string username。

2.3  WCF编程的步骤:

 1、创建服务接口:

    a. using system.servicemodel

    b.接口类应用属性:servicecontract,服务契约

    c.接口中的公开方法应用属性:operationcontract,操作契约

d.接口外的复合类型(实体类)应用属性:datacontract,数据契约

2、实现服务接口(协定)。

3、通过指定终结点信息和其他行为信息来配置服务。

4、在应用程序中承载服务。

5、生成客户端应用程序