WCF的每一个服务都具有一个唯一的地址(Address)。地址包含两个重要元素:服务位置与传输协议,或者是用于服务通信的传输样式。

服务位置包括:目标机器名、站点或网络、通信端口、管道或队列,以及一个可选的特定路径或者URI。URI即统一资源标识,它可以是任意的唯一标识的字符串,例如服务名称或GUID。

WCF1.0支持的传输样式有:

  • HTTP
  • TCP
  • Peer network(对等网)
  • IPC(基于命名管道的内部进程通信)
  • MSMQ

地址通常采用如下格式:

        [基地址]/[可选的URI]

基地址(Base Address)通常的格式如下:

        [传输协议]://[机器名或域名][:可选端口]

下面是一些地址的示例:

http://localhost:8001

http://localhost:8001/MyService

net.tcp://localhost:8002/MyService

net.pipe://localhost/MyPipe

net.msmq://localhost/private/MyService

net.msmq://localhost/MyService

TCP地址

TCP地址采用net.tcp协议进行传输,通常它还包括端口号,例如:

net.tcp://localhost:8002/MyService

如果没有指定端口号,则TCP默认的端口号为808:

net.tcp://localhost/MyService

两个TCP地址(来自于相同的宿主)可以共享一个端口:

net.tcp://localhost:8002/MyService

net.tcp://localhost:8002/MyOtherService

注意:我们可以将不同宿主的TCP地址配置为共享一个端口。

HTTP地址

HTTP地址使用http协议进行传输,也可以利用https进行安全传输。HTTP地址通常会被用作对外的基于Internet的服务,并为其指定端口号,例如:

http://localhost:8001

如果没有指定端口号,则默认为80。与TCP地址相似,两个相同宿主的HTTP地址可以共享一个端口,甚至相同的机器。

IPC地址

IPC地址使用net.pipe进行传输,这意味着它将使用Windows的命名管道机制。在WCF中,使用命名管道的服务只能接收来自同一台机器的调用。因此,在使用时必须指定明确的本地机器名或者直接命名为localhost,为管道名提供一个唯一的标识字符串:

net.pipe://localhost/MyPipe

每台机器只能打开一个命名管道,因此,两个命名管道地址在同一台机器上不能共享一个管道名。

MSMQ地址

MSMQ地址使用net.msmq进行传输,即使用了微软消息队列(Microsoft Message Queue,MSMQ)机制。使用时必须为MSMQ地址指定队列名。如果是处理私有队列,则必须指定队列类型,但对于共有队列而言,队列类型可以省略:

net.msmq://localhost/private/MyService

net.msmq://localhost/MyService

对等网地址

对等网地址(Peer Network Address)使用net.p2p进行传输,它使用了Windows的对等网传输机制。如果没有使用解析器(Resolver),我们就必须为对等网地址指定对等网名、唯一的路径以及端口。