Windows 通信基础(Windows Communication Foundation,WCF)是基于Windows 平台下开发和部署服务的软件开发包(Software Development Kit,SDK)。
服务(Service)是公开的一组功能的集合。从软件设计的角度考虑,软件设计思想经历了从函数发展到对象,从对象发展到组件,再从组件发展到服务的几次变迁。
面向服务(Service-Orientation,SO)是一组原则的抽象,是创建面向服务应用程序的最佳实践。
WCF中的所有消息均为SOAP消息。注意WCF的消息与传输协议无关,这与Web服务不同。因此,WCF服务可以在不同的协议之间传输,而不仅限于HTTP。
WCF服务通过公开元数据(Metadata)的方式描述可用的功能以及服务采用的通信方式。
不管是本地服务还是远程服务,客户端总是通过代理(Proxy)调用服务。
一个公开的WCF服务由三部分组成(终结点EndPoint):地址Address、绑定Binding和契约Contract。
地址定义了服务的位置,绑定定义了服务通信的方式,契约则定义了服务的内容。
一般管理服务的方式简称为服务的ABC。
每个终结点都包含了三个元素,而宿主则负责公开终结点。从逻辑上讲,终结点相当于服务的接口,就像CLR或者COM接口一样。
核心要素:
从技术层面理解WCF,可以分为三个要素(俗称WCF的ABC)
1.Address(where):地址,是指访问服务的URI(可以是一个http地址,也可以是tcp的地址)。我到哪里(Where)寻找这个服务?
2.Binding(how):绑定,是指通讯所使用的协议,例如http,net.tcp,msmq等等。我如何(How)与这个服务交互?
3.Contract(what):合约,是指通讯的规范,例如服务的合约,数据的合约等等。这个服务是什么(What)?
从系统层面理解WCF,可以分为四个要素
1.Contract:合约,定义一套合约,通常是WCF开发的起点。这也是唯一需要在宿主和客户端之间共享的信息,通常是一些接口(interface)定义。
2.Service:服务,基于合约实现的一个具体服务。通常是一些类型(class)定义,实现了业务逻辑。
3.Host:宿主,既然服务是一个class,它自身是无法对客户端请求进行响应的。所以需要有一个宿主程序来提供持续的监听。WCF的宿主可以是任意的应用程序,非常灵活。
4.Client:客户端,任何客户端(例如Windows Forms,WPF, Silverlight,Console Application,甚至Javascript,或者java,php等等)都可以通过自己的方式来访问WCF.
WCF基本术语如下:
地址
WCF的每一个服务都具有一个唯一的地址(Addresses)。地址包含两个重要元素:服务位置与传输协议(Transport Protocol),或者是用于服务通信的传输样式(Transport Schema)
例如:URI为http://localhost:8001/MyService,则读作:“采用HTTP协议访问localhost机器,MyService服务在8001端口处等待用户的调用。”
URI 即统一资源标识(Universal Resource Identifier)
契约
WCF 的所有服务都会公开为契约(Contract)
WCF 定义了四种类型的契约:
服务契约(Service Contract):描述了客户端能够执行的服务操作,即服务端公开的方法。方法契约(OperationContract)
数据契约(Data Contract):定义了与服务交互的数据类型,即自定义类型。
错误契约(Fault Contract):定义了服务抛出的错误,以及服务处理错误和传递错误到客户端的方式。
消息契约(Message Contract):允许服务直接与消息交互。如果系统要求互操作,或者遵循已有消息格式,那么消息契约会非常有用。
只有接口(或者类)可以被标记为 ServiceContract 特性,从而被定义为WCF服务,其他类型都不允许。
WCF 只允许将OperationContract 特性应用到方法上,而不允许应用到同样属于CLR概念的属性、索引器和事件上。WCF 只能识别作为逻辑功能的操作(Operation)。
契约操作不能使用引用对象作为参数,只允许使用基本类型或数据契约。
服务类的约束:避免使用带参构造函数,因为WCF只能使用默认构造函数。虽然类可以使用内部的属性、索引器以及静态成员,但WCF客户端却无法访问它们。
每个WCF服务都必须托管(Hosting)在Windows 进程中,该进程被称为宿主进程(Host Process)。
单个宿主进程可以托管多个服务,而相同的服务类型也能够托管在多个宿主进程中。
绑定(Binding)
一个绑定封装了诸如传输协议、消息编码、通信模式、可靠性、安全性、事务传播以及互操作性等相关选项的集合,使得它们保持一致。绑定使得开发者能够基于不同的基础
功能模块使用相同的服务逻辑。
标准绑定
WCF定义了9种标准绑定
基本绑定(Basic Binding)
由BasicHttpBinging类提供。基本绑定能够将WCF服务公开为旧的 ASMX Web 服务,使得旧的客户端能够与新的服务协作。
传输协议:HTTP/HTTPS 编码格式:Text,MTOM 支持互操作性
注:MTOM:有效负载编码格式。(Message Transport Optimization Mechanism)
Web服务(WS)绑定
由WSHttpBinding类提供。WS绑定使用HTTP或HTTPS进行传输,为基于Internet的通信提供了诸如可靠性、事务性与安全性等特性。
传输协议:HTTP/HTTPS 编码格式:Text,MTOM 支持互操作性
WS双向绑定(Duplex WS Binding)
由WSDualHttpBinding 类提供。WS双向绑定与WS绑定相似,但它还支持从服务到客户端的双向通信。(第五章)
传输协议:HTTP 编码格式:Text,MTOM 支持互操作性
托管:
1.IIS
IIS托管:优势是宿主进程可以在客户端提交第一次请求的时候自动启动,还可以借肋IIS管理宿主进程的生命周期。IIS托管的主要缺点在于只能使用HTTP协议。
IIS托管需要在IIS下创建虚拟目录,并提供一个.SVC文件。使用IIS托管,服务的基地址必需与.svc文件的地址保持一致。
2.Windows 激活服务(Windows Activation Service,WAS)
IIS 与WAS 的主要区别在于WAS并不局限于使用HTTP,它支持所有可用的WCF 传输协议、端口与队列。
若要使用WAS 托管WCF服务,必须提供一个.svc文件,这与IIS 托管一样。