在WCF中,每一个服务都有唯一的地址。
WCF支持下列传输样式
地址通信通常采用以下格式:
[基地址]/[可选的URI]
基地址通常采用以下格式:
[传输协议]://[机器名或域名][:可选端口]
下面是一些地址的示例:
http://localhost:8001
http://localhost:8001/MyService
net.tcp://localhost:8002/MyService
net.pipe://localhost/MyPipe
net.msmq://localhost/private/MyQueue
传输协议 | 默认端口 | 示例 | |
TCP地址 | net.tcp | 808 | net.tcp://localhost:8002/MyService |
HTTP地址 | http,https | http(80),https(443) | http://localhost:8001 |
IPC地址 | net.pipe | net.pipe://localhost/Mypipe | |
MSMQ地址 | net.msmq | net.msmq://localhost/private/MyService | |
服务总线地址 | sb,http,https | sb://MyNamespace.servicebus.window.net/ | |
几种传输协议的特点
HTTP提供简单的请求-回复(Request-Response)消息传输方式
HTTP是无状态的,每次HTTP请求都是相互独立的
HTTP是无连接的,基于HTTP的数据传输无须事先打开连接
TCP是基于连接的传输协议,在开始进行数据传输之前,通过客户端和服务器之间的3次握手创建连接;在结束传输之后,通过4次握手终止连接
TCP是有状态的,由于数据传输在一个确定的连接中进行,因此可以保持每次数据传输的状态
TCP支持全双工通信,一旦连接成功创建,数据就可以在两个方向上同时传输。
TCP支持可靠通信,IP协议本身提供的数据传输是不可靠的,数据的可靠性只能通过TCP来保证。
命名管道是windows平台及UNIX系统下实现跨进程通信的标准实现方式,WCF只将命名管道专门用于同一台机器的跨进程通信。所以基于命名管道的URI的主机名,域名,IP地址部分只能是本机的机器名,localhost或127.0.0.1
即消息队列
WCF的所有服务都会公开为契约(Contracts)。契约与平台无关,是描述功能的标准方式。WCF定义的契约有以下四种类型。
服务契约描述了客户端能够执行的服务操作。
只有接口和类可以标记为Servicecontract属性。
契约与类型的访问限定无关。
类型的所有成员也不一定就是契约的一部分。必须使用OperationContractAttribute属性显著标明哪些方法需要暴露为WCF契约中的一部分。
WCF只允许将OperationContract属性标记到方法上。
契约操作不能使用引用对象参数,只允许使用基本类型或者数据契约。
[ServiceContract] interface IMyContract { [OperationContract] string MyMethod(string text); //不会成为契约的一部分 string MyOtherMethod(string text); } class MyService:IMyContract { public string MyMethod(string text) { return "Hello" + text; } public string MyOtherMethod(string text) { return "Hello" + text; } }
还有WCF允许直接将ServiceContract属性标记到服务类上,但我们应该尽量避免,这样有利于在不同的场景下使用契约。
服务契约的默认命名空间是Http://tempuri.org,也可以自定义命名空间。
默认情况下,契约公开的名称就是接口名,也可以使用Name属性定义别名。
类似的,操作公开的名称就是方法名,同样也可以用Name属性定义别名。
[ServiceContract(Namespace="MyNameSpace",Name="IMy")] interface IMyContract { [OperationContract(Name="Method")] string MyMethod(string text); //不会成为契约的一部分 string MyOtherMethod(string text); }
数据契约定义了与服务交互的数据类型。
错误契约定义了服务抛出的错误,以及服务处理错误和传递错误到客户端的方式。
消息契约允许服务直接与消息交互,可以是类型化的,也可以是非类型化的。