远程服务进行通信还是与本地进程进行通信,都需要使用代理。
18.2.2 地址
在Internet中,为了标识每个计算机,就需要使用IP进行地址划分,在生活中也有此实例,例如每个家庭都有一个门牌号,为了方便找到某个人,则必须通过门牌号找到这个人,同样对于WCF服务而言,每个WCF服务都有一个自己的地址。
1.WCF地址
WCF地址包含两个元素,服务位置与传输协议,服务位置包括目标机器名、站点或
网络、通信端口、管道或队列,以及一个可选的特定路径或者URI。WCF地址也可以是用于服务通信的传输样式。WCF支持的传输样式包括:
? HTTP:超文本传输协议。 ? TCP:传输控制协议。 ? Peer network:对等网。
? IPC:基于命名管道的内部进程通信协议。 ? MSMQ:微软消息队列。
地址通常通过[基地址]/[可选的URI]的格式进行WCF地址描述,示例地址如下所示。
localhost:8731
localhost:8731/18-2
net.tcp://localhost:8731/server/18-2 net.pipe://localhost/18-2 net.msmq://localhost/18-2
其中关于localhost:8731这个地址可以称作使用http协议,访问计算机为localhost的端口8731正在等待客户端的调用。而对于localhost:8731/18-2这个地址可以称作使用http协议,访问
计算机为loacalhost的端口为8731的18-2服务正在等待客户端的调用。
2.TCP地址
460
TCP地址使用TCP传输控制协议作为通信协议,使用TCP地址的示例地址如下所示。
net.tcp://localhost:8731/server/18-2
如果端口号没有指定,则TCP会使用默认端口号808作为其默认端口,示例地址如下所示。
net.tcp://localhost/server/18-2
3.HTTP地址
HTTP地址使用HTTP传输控制协议作为其通信协议,使用HTTP地址的示例地址如下所示。
localhost:8731/18-2
如果端口号没有指定,则HTTP会使用默认的端口号80作为其默认端口。 注意:无论是TCP协议还是HTTP协议,不同的服务可以公用相同的端口号。 4.IPC和MSMQ地址
IPC地址使用net.tcp作为通信协议,使用net.tcp地址的示例地址如下所示。
net.pipe://localhost/18-2
正是因为IPC地址使用net.pipe进行传输,所以IPC地址将使用Windows的命名管道机制。在WCF中,如果服务使用命名管道,则该服务只能接收来自同一台客户端计算机的调用。因此,在使用时必须明确的指定WCF提供服务的计算机名,从而为管道名提供一个惟一的标识字符串。而MSMQ地址使用net.msmq进行传输,即使用了微软消息队列机制,MSMQ地址的示例地址如下所示。
net.msmq://localhost/18-2
18.2.3 契约
在WCF中,所有的WCF服务都会被公开成为契约。契约是服务的功能的标准描述方式,通常情况下WCF包含四种类型的契约,这些契约如下所示。
? 服务契约(Service Contract):服务契约定义了客户端能够执行的操作,服务契约是WCF中使
用最为广泛的一种契约。
? 数据契约(Data Contract):数据契约定义了客户端与服务器之间交互的数据类型。
? 错误契约(Fault Contract):错误契约定义了操作中出现的异常,包括定义服务出现的错误并
传递返回给客户端。
? 消息契约(Message Contract):消息契约允许服务直接与消息交互,但是WCF很少使消息契
约。
WCF使用特性ServiceContractAttribute标识服务契约,而使用OperationContractAttribute标识服务方法。示例代码如下所示。
[ServiceContract] public interface IService1
//标识服务契约 //实现接口 //方法声明 //创建方法
{
[OperationContract] string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite); // 任务: 在此处添加服务操作 }
上述代码使用ServiceContractAttribute标识服务契约,而使用OperationContractAttribute标识服务方法,