WCF技术剖析(卷1)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1.1 URI

URI的全称是Uniform Resource Identifier(统一资源标识),它唯一标识一个确定的网络资源,同时也表示资源所处的位置及访问的方式(资源访问所用的网络协议)。对于EndpointAddress中URI来说,该资源就是服务本身。URI具有如下的结构:

        [传输协议(Scheme)]://[主机名称|域名|IP地址]:[可选端口]/[资源路径]

比如下面一个URI是基于WCF服务的.svc文件的URI:http://artech.com:9999/myservices/CalculatorService.svc,各部分分别表示为:

● 传输协议(scheme) :http

● 主机名称 :artech.com

● 端口 :9999

● 资源路径 :myservices/CalculatorService.svc

URI不仅指明了资源所处的位置,也指明了资源访问的方式。上面的URI指明了承载服务的.svc文件所处的网络位置:artech.com:9999/myservices/CalculatorService.svc,也指明了获取该.svc文件须要采用的传输协议:http。接下来介绍几种典型传输协议下的URI。

HTTP URI和HTTPS URI

HTTP全称为HyperText Transfer Protocol(超文本传输协议),是建立在TCP/IP簇上的应用层协议。HTTP通过万维网(WWW:World Wide Web)解决超文本的传输。由于其简单、易用,已经成为了事实上的Internet标准。HTTP具有下面一些特点:

● HTTP提供简单的请求/回复(request/reply)消息传输方式;

● HTTP是无状态的,每次HTTP请求都是相互独立的;

● HTTP是无连接的,基于HTTP的数据传输无须事先打开连接。

HTTPS全称为HyperText Transfer Protocol Over Secure Socket Layer(安全超文本传输协议)。它是为了在WWW上解决安全的数据传输而设计的。HTTPS是采用了SSL(Secure Socket Layer)的HTTP,而SSL是一个进行书记加密的协议,很多安全性要求较高的网站都采用HTTPS。而WCF通过HTTPS实现了基于HTTP的传输安全(Transport Security)。关于HTTPS和传输安全模式将被安排在下一卷关于安全的章节中。

HTTP和HTTPS的URI分别使用http和https作为传输协议前缀(Scheme),它们默认使用的端口分别为80和443,所以下面两组URI是等效的:

        http://artech.com:80/myservices/CalculatorService.svc
        https://artech.com:443/myservices/CalculatorService.svc
        http://artech.com/myservices/CalculatorService.svc
        https://artech.com/myservices/CalculatorService.svc

NET.TCP URI

TCP全称Transport Control Protoco(l传输控制协议),在整个TCP/IP簇中处于核心地位。从整个协议分层结构来看,位于应用层之下,网络层(IP协议)之上。。较之HTTP,TCP具有如下的特点:

● TCP是基于连接的传输协议,在开始进行数据传输之前,通过客户端和服务端之间的3次“握手”创建连接;在结束传输之后,通过4次“握手”中止连接;

● TCP是有状态的,由于数据传输在一个确定的连接中进行,所以可以保持每次数据传输的状态;

● TCP支持全双工(Duplex)通信,一旦连接成功创建,数据可以在两个方向上同时传输:从客户端到服务端和从服务端到客户端;

● TCP支持可靠通信(Reliable Messaging),IP协议本身提供的数据传输是不可靠的,数据的可靠传输只能通过TCP来保证。

WCF通过NetTcpBinding支持基于TCP的传输。对于TCP的URI,其传输协议前缀均为net.tcp://。net.tcp默认的端口808,下面两个URI完全是等效的:

        net.tcp://artech.com:808/myservices/CalculatorService
        net.tcp://artech.com/myservices/CalculatorService

Net.Pipe URI

对于同一台机器上不同进程间的通信(IPC:Inter Process Communication),WCF具有专门的实现方式:命名管道(Named Pipes)。命名管道是Windows平台及Unix系统下IPC的标准实现方式,通过命名管道进行跨进程通信能够获得最好的性能优势。虽然命名管道本身可以实现跨机器的通信,但是WCF却将命名管道专门用于同一台机器的跨进程通信,所以基于IPC的URI的主机名称|域名|IP地址部分只能是本机的机器名,或者直接是localhost或127.0.0.1。

基于IPC的URI,都具有net.pipe前缀。在基于同一台机器不同进程间通信中,端口没有任何意义,下面是一个典型的net.pipeURI。

        net.pipe://127.0.0.1/myservices/CalculatorService

Net.Msmq URI

消息队列(Message Queuing,也称MSMQ),是微软对消息服务领域的开创性尝试。由于消息队列采用了特殊的通信机制,对于改善和提高系统的可扩展性(scalability)和高可用性(High Availability)具有重要的意义。消息队列按照可访问性可分为两种类型的队列。

公共消息队列:公共消息队列发布于活动目录(AD:Active Directory)列表中,并被复制到Windows域(Domain)。因为可以在不知道队列所在机器名称的情况下对公共队列进行检索,因而将公共队列从一台计算机移到另一台上,并不会对客户端应用造成影响。

私有消息队列:私有消息队列一般在没有AD的工作组(Workgroup)环境中使用,它们不支持身份验证,并且需要队列所在的计算机名称方能定位。

WCF下,基于消息队列的URI,具有net.msmq前缀。net.msmq地址中须要指明队列的类型(公有队列:public;私有队列:private)。由于默认为公有队列,所以对于公有队列,队列类型部分可以省略。

        net.msmq://artech.com/myservices(公有队列)
        net.msmq://artech.com/private/myservices(私有队列)