- 一个WCF服务向WCF客户提供一些可用的功能。WCF客户通过终结点(endpoint)来访问WCF服务。因此,一个WCF服务至少要包含一个终结点。如果允许服务端反过来调用客户端的代码(即所谓回调callback),则客户端也应该提供回调所使用的终结点。
- WCF服务与客户程序要想成功通讯,必须遵循特定的协议,WCF规定,在WCF服务与WCF客户间发送的所有消息都遵循SOAP协议。
- 终结点与它的“ABC”每个终结点都向外界提供一个服务的访问点。
每个终结点都定义着一个地址(A:Address),指明“到哪儿可以找到服务”。
绑定(B:Binding)指明“如何与服务进行通讯”。
契约(C:Contract)定义了“服务能干哪些事”。契约定义了一个终结点向外界发布的操作,以及WCF服务与客户相互通讯时的消息格式。WCF中有四种类型的契约。
服务契约(Service Contract)
实现“服务契约”很容易:定义一个接口,给接口附加[ServiceContract],给接口方法附加[OperationContract]。
[ServiceContract]
public interface IHelloWCFService
{
[OperationContract]
string GetServiceMessage();
}
[ServiceContract]还可以直接施加于类之上。但不推荐这么做。另外,一个类可以实现多个[ServiceContract]。
数据契约(DataContract)
数据契约定义将在客户端与服务器端传送的各种数据类型。
[DataContract]
structContact
{
[DataMember]
public string FirstName;
[DataMember]
public string LastName;
}
定义数据契约时需要使用[DataContract]和[DataMember]。
消息契约(Message Contract):可以使用消息契约来定制WCF服务与WCF客户间相互通讯的SOAP消息格式。
错误契约(Fault Contract):定义在服务中如何处理异常,以及这些异常又如何传送到客户端。
A:地址(Address)地址指明在哪儿可以找到特定的WCF服务。地址的格式如下:
http://localhost:8000/HelloWCFService
[通讯协议]://[服务器名或IP地址][:端口号]/[可选的其他URI]
只要子地址不同,不同的服务可以共享同一个TCP端口。
WCF地址类型与通讯协议对应
使用TCP:地址以“net.tcp”打头,多用于局域网环境
使用HTTP:地址以“http”和“https”打头,多用于互联网环境
使用消息队列:地址以“net.msmq”打头。消息队列用于提供离线的消息服务,即调用服务时WCF服务程序可以还没运行,调用请求被放到一个消息队列中,WCF服务程序启动后取出此请求,解析后向WCF客户提供服务。适用于局域网环境。
使用命名管道:地址以“net.pipe”打头。当WCF服务与WCF客户都位于同一台计算机时,这种通讯方式可以获得好的性能
服务的基地址与子地址
一个服务,可以有多个终结点,服务的地址称为“基地址”,而终结点地址是在此基础上再追加一个子地址而确定的。
B:绑定(Binding)绑定定义了客户端与服务端交换信息所需要的通讯配置参数,比如传输协议,消息编码方式等。
简单地说:绑定定义了客户端如何与服务端通讯。WCF服务可以使用多种类型的绑定,.NET提供了一些现成的绑定可供使用。
此外,.NET还提供了一个CustomBinding类,用于自定义绑定。真的是非常灵活!
WCF预定义绑定
BasicHttpBinding、WSHttpBinding和WSFederationHttpBinding:使用HTTP
WSDualHttpBinding:使用两个HTTP通道实现双向通讯
NetTcpBinding:使用TCP
NetPeerTcpBinding:使用P2P(很Cool的一个绑定,后面会用它来开发有趣的应用)
NamedPipeBinding:使用命名管道
NetMsmqBinding和MsmqIntegrationBinding:使用消息队列
有关绑定需要注意的……
绑定定义了与终结点进行通讯的通道(channel )。
可以把通道想象是自来水管,信息就是在管中流动的水。
WCF提供不同用途的“管子”,有的管子只管传输信息,有的管子负责保证数据安全,有的管子负责压缩数据,……,把这些不同用途的管子接在一块,就形成了一个“信息水管”。WCF服务与WCF客户分别位于这个管子的两端。
整个“信息水管”是一段段的,每一段都可以被取走或替换为另一种功能的“管子”(你也可以创建自己的“管子”),通过管子的动态组合可以实现高度的灵活性。
服务的宿主
概述WCF服务应有一个宿主程序。可选的宿主程序类型有:IIS,WAS,Windows Form/WPF Application,Console Application,Windows Service。
在客户端可以访问服务之前,服务宿主进程必须启动。
一个服务宿主程序可以同时承载多个服务。
ServiceHost对象
在WCF中,由ServiceHost对象负责启动和停止服务。每个服务都对应着一个ServiceHost对象,调用ServiceHost.Open方法启动服务,这时可以接收客户端的服务请求,调用ServiceHost.Close方法停止服务,这时,不再理会客户端的服务请求。
注意对应关系!
一个服务宿主程序可以同时承载多个服务,每个服务对应着一个ServiceHost对象。
一个ServiceHost可以拥有多个终结点(牢记终结点的“ABC”),通过调用ServiceHost.AddServiceEndPoint()方法添加终结点。
使用配置文件定义服务为了方便起见,我们一般使用配置文件来定义服务的终结点。