WCF(Windows Communication Foundation)是基于Windows平台下开发和部署服务的SDK。WCF为服务提供了运行时环境,使得开发者能够将CLR类型公开为服务,又能够已CLR类型的方式使用服务。
服务是公开的一组功能的集合。服务的创建对于外部而言是不透明的,所以WCF服务通常通过公开元数据(metadata)的方式描述可用的功能以及服务可能采用的通信方式。
元数据实际就是服务中所描述的终结点(Endpoint)。终结点是由地址(Address)、绑定(Binding)、契约(Contract)组成。就是WCF中常说的ABC三要素。
地址(Address)。WCF的每个服务都具有一个唯一的地址(Address)。地址包含两个重要元素:服务位置与传输协议(transport protocol),或者是用于服务通信的传输样式(transport schema)。
服务位置包括目标机器名、站点或网络、通信端口、管道或队列,以及一个可选的特定路径或者URI。
WCF支持的传输协议:
HTTP http://localhost:8001/MyService
TCP net.tcp://localhost:8002/MyService
Peer network(对等网)
IPC(内部进程In-Proc)net.pipe://localhost/MyPipe
MSMQ net.msmq://local host/private/MyQueue 如果处理私有队列,则必须指定队列类型,但对于公有队列,队列的类型可以省略。
绑定(Binding)。服务之间的通信方式多种多样,有多种可能的通信模式。WCF定义了六种常用的绑定:
基本绑定(Basic Binding)
TCP绑定
IPC绑定
Web服务绑定(WS-* Binding)
WS双向绑定(Duplex WS Binding)
MSMQ绑定
绑定的格式与编码。每种标准绑定使用的传输协议与编码格式都不同,多个编码的可能性是存在的。常用绑定的传输协议与编码格式:
名字 | 传输协议 | 编码格式 | 互操作性 |
BaseHttpBinding | HTTP/HTTPS | Text,MTOM | Yes |
NetTcpBinding | TCP | Binary | No |
NetNamedPipeBinding | IPC | Binary | No |
WSHttpBinding | HTTP/HTTPS | Text, MTOM | Yes |
WSDualHttpBinding | HTTP | Text,MTOM | No |
NetMsmqBinding | MSMQ | Binary | No |
文本编码格式通常允许WCF服务(或客户端)能够通过HTTP协议与其他服务(或客户端)通信,而不用考虑通信传输的范围。二进制编码格式可以获得做好的性能,却是以牺牲互操作性为代价的。因为它只支持WCF端到WCF端的通信。MTOM(Message Transmission Optimization Machanism)消息优化传输机制.
为服务选择绑定应该有一定规律,我们一般走遵守如下图的决策。
除了上面说的常用六种绑定,WCF还定义了六种不常用的绑定。这些绑定是针对某种特定的目标场景而设计,不能脱离该场景使用这些绑定。
对等网绑定
WS联邦绑定
WS 2007联邦绑定
MSMQ集成绑定
Web绑定
WS2007绑定
契约(Contract)。WCF的所有服务都会公开为契约。契约与平台无关,是描述服务功能的标准方式。WCF定义了四种类型的契约:
服务契约(Service Contract)
数据企业(Data Contract)
错误契约(Fault Contract)
消息契约(Message Contract)
托管。WCF服务类不能凭空存在。每个WCF服务都必须托管(host)在Windows进程中,改进程被称为宿主进程(Host Process)。单个宿主进程可以托管多个服务,而相同的服务类型也能够托管在多个宿主进程中。如果服务与客户端驻留在相同的进程中,则称为进程内托管。常见的托管方式:IIS托管、WAS托管、自托管。
IIS托管和发布网站类似,需要创建虚拟目录,还需要.svc文件。.svc文件的功能主要用于识别隐藏在文件和类后面的服务代码。只支持HTTP协议。
WAS托管。Windows激活服务是一个系统服务。可以独立的安装与配置。支持所有可用的WCF传输协议、端口与队列。
自托管是有开发者提供和管理宿主进程的生命周期。
WCF用终结点表示地址、绑定、契约一种组成关系。
参考资料:《WCF编程第二版》、MSDN