WCF顾明思义,就是在Windows平台下解决通讯(C,Communication)的基础框架(F,Foundation)问题。 终结点是WCF最为核心的对象,由于它承载了全部通讯功能。服务经过相应的终结点发布出来,客户端经过与之匹配的终结点对服务进行调用。终结点由表明地址、绑定和契约的ABC三要素构成。 做为终结点的三要素之一的地址(Address)、在基于WCF的通讯中不只仅用于定位服务,还提供额外的寻址信息。除此以外,终结点还和安全有关系,由于它包含着用于进行服务认证的服务身份信息。
2.1 统一资源标识(URI)
2.1.1 HTTP/HTTPS
2.1.2 Net.TCP
2.1.3 Net.Pipe
2.1.4 Net.Msmq
2.2 EndpointAddress
2.2.1 服务端终结点地址
2.2.2 客户端终结点地址
2.2.3 地址报头
2.3 端口共享
2.3.1 端口共享意义何在
2.3.2 HTTP|HTTPS端口共享
2.3.3 TCP端口共享
2.4 逻辑地址与物理地址
2.4.1 服务的角色
2.4.2 监听地址与监听模式
2.4.3 ClientViaBehavior
2.4.4 实例演示:经过tcpTrace进行消息的路由(S205,S206)
2.5 请求监听与消息分发
2.5.1 链接请求的监听
2.5.2 消息分发
URI全称是Uniform Resource Identifier(统一资源标识),它惟一地标识一个网络资源的同时也标识资源所处的位置及访问方式(资源访问所用的网络协议)。URI具备以下的结构:
传输协议://[主机名称|域名|IP地址]:[可选端口]/[资源路径]
2.1.1 HTTP/HTTPS
HTTP全称为HyperText Transfer Protocol(超文本传输协议),是创建在TCP/IP簇上的应用层协议。
HTTP提供简单的请求-恢复(Request-Reply)消息传输方式
HTTP是无态的,每次HTTP请求都是相互独立的
HTTP是无链接的,基于HTTP的数据传输无需事先打开链接
HTTPS全称为HyperText Transfer Protocol over Secure Socket Layer(安全超文本传输协议),它是采用了SSL(Secure Socket Layer)的HTTP,而SSL是一个进行数据加密的协议,不少安全性要求较高的网站都采用HTTPS。 WCF经过HTTPS实现了基于HTTP的传输安全(Transport Security)。
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
2.1.2 Net.TCP
TCP全称为Transport Control Protocol(传输控制协议),在整个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
2.1.3 Net.Pipe
命名管道(Named Pipes)是Windows平台及UNIX系统下实现跨进程通讯(Inter Process Communication,IPC)的标准实现方式。虽然命名管道自己能够实现跨机器的通讯,可是WCF只将命名管道专门用于同一台机器的跨进程通讯,因此基于命名管道的URI的主机名称|IP地址部分只能是本机的机器名、localhost或127.0.0.1。下面是一个典型的Net.Pipe URI
net.pipe://127.0.0.1/myservices/CalculatorService
2.1.4 Net.Msmq
消息队列(Message Queuing,也称MSMQ),是微软对消息服务领域的开创性尝试。因为消息队列采用了特殊的通讯机制,所以对于改善和提升系统的可扩展性(Scalability)和高可用性(High Availability)具备重要的意义。按照可访问性,消息队列可分为以下两种类型。
公共消息队列:共有队列的名称被注册到AD域中,因此咱们无须指定队列所在的机器名称就能够访问队列。当将某个共有队列从一台机器转移到另外一台机器时,访问该队列的应用能够保持不变。共有队列还能够提供基于域帐号的Windows认证机制,因此对于正式发布的应用来讲,一般采用共有队列。
私有消息队列:由于共有队列须要注册到AD域中,因此它只能用在域(Domain)模式下。在工做组(Work Group)模式下,只能使用私有队列。而访问私有队列须要制定包含队列所在机器名称的路径。
除了普通的用于存储业务数据消息的普通队列以外,还有存储确认消息的管理队列、存储消息拷贝的日志队列、存储回复消息的回复队列、存储死信消息的死信队列等。除了基于独立文件的物理队列以外,还有依附于物理队列的子队列。
WCF下基于消息队列的URI具备net.msmq前缀。在主机名和队列名称之间经过字符Private表示私有队列,而对于公有队列的URI,表示队列类型部分则不是必需的。下面给出了两个Net.Msmq地址。
net.msmq://artech.com/myservices(公有队列)
net.msmq://artech.com/private/myservices(私有队列)
终结点在WCF应用编程接口中经过System.ServiceModel.Description.ServiceEndpoint类型表示。三个核心属性分表表示终结点的地址、绑定和契约三要素.
2.2.1 服务端终结点地址
2.2.2 客户端终结点地址
2.2.3 地址包头
对于一些经常使用的网络服务,它们都有一个知名端口号与之匹配:FTP服务的TCP端口为21,Telnet服务的TCP端口为23
而客户端一般对所使用的端口并不关心,只须要保证端口在本机是惟一的就能够了。这样的端口幼教临时端口,临时端口通常在1024~5000之间
2.3.1 端口共享意义何在
在通常的网络环境中,为了尽量避免网络攻击,都会经过防火墙将绝大部分的端口进行屏蔽,仅仅保留哪些经常使用的网络服务所用的端口,或者仅为某一类应用保留少许的端口。总而言之,咱们不能保证每一个跨防火墙通讯的应用都具备一个惟一的端口,它们只能共享一个活少许的几个端口。
在Intranet内部,为了保证部署与局域网内的其余计算机的网络应用可以与本级进行正常通讯,一般会在本级的防火墙中预留少数几个可用的端口。intranet内部的主机之间可使用这些预留的端口,经过相应的传输协议进行通讯。而对于处于internet和本地网络之间的防火墙,一般只保留80|443端口,保证基于HTTP|HTTPS的网络通讯可以正常进行。因此不管基于Intranet仍是Internet,端口共享都具备现实意义。
2.3.2 HTTP|HTTPS端口共享
2.3.3 TCP端口共享
Net.TCP端口共享服务
从功能上讲,Net.TCP端口共享服务实现了HTTP.SYS相同的功能,即请求的监听和分发。不过HTTP.SYS运行在内核模式(Kernel Mode)下,而Net.Tcp端口共享服务运行在用户模式(User Mode)下
TCP端口共享与NetTcpBinding
在netTcpBinding节点下的binding中配置portSharingEnabled=“true”
表明终结点地址类型的EndPointAddress对象的Uri属性仅仅表明服务的逻辑地址。而咱们所说的物理地址,对于服务器来讲是监听地址。对于客户亿来讲则是消息真正发送的目标地址。在默认状况下,物理地址和逻辑地址是统一的,可是因为网络环境的限制,咱们须要实现逻辑地址与物理地址的分离。
2.4.1 服务器的角色
2.4.2 监听地址与监听模式
ListenUri
ListenUri能够经过配置的方式制定,表示服务端终结点的配置节点(services/service/endpoint),具备ListenUri属性。若是没有对ListenUri进行显示设置,改属性的值和终结点地址具备相同的URI 也就是说,在默认状况下服务端终结点的逻辑地址和物理地址并非分离的。
ListenUriMode
当咱们设置了终结点的ListenUri属性后,并不意味着该终结点必定会采用这个URI进行请求监听。 最终的监听地址还具备另外一个决定性因素,那就是监听模式。
ListenUriMode的两个枚举分别表示两种决定最终监听地址的方式。Explicit表示严格采用终结点的ListenUri属性设置的Uri做为最终的监听地址,而Unique则根据ListenUri采用不一样的策略保证最终使用的监听地址是惟一的。WCF采用以下的策略保证监听地址的惟一性:
若是采用TCP做为传输协议,在不采用端口共享的状况下,会选择一个
未被使用的端口做为最终监听地址的端口以确保地址的惟一性。
若是采用TCP做为传输协议,在不采用端口共享的状况下,会
添加一个GUID做为后缀以确保地址的惟一性。
对于非TCP做为传输协议,会
添加一个GUID做为后缀以确保地址的惟一性。
2.4.3 ClientViaBehavior行为
客户端实现逻辑地址与物理地址的分离是经过一个终结点行为实现的。行为在WCF中是一个很是重要的概念,也是对WCF进行扩展的最为重要的方式。契约是服务端和客户端就某个方面达成的一种共识,是一种双边协议;而
行为则是客户端或者服务端本地实现某个功能的一种方式,是一种单边行为。
契约行为和操做行为被定义成特性(Attribute)并分别应用到契约接口/类或者契约接口和服务类型的操做方法之上,而终结点行为则只能经过配置的方式应用到服务端或者客户端节点上;至于服务行为, 既能够采用基于特性声明式的应用方式,也支持配置的应用方式。
服务行为和终结点行为分别定义在behaviors/serviceBehaviors和behavior/endpointBehaviors
服务的配置节点services和终结点的配置节点services/service/endpoint, 在endpoint节点上有一个behaviorConfiguration ,这是用来设置服务行为和终结点行为的。
WCF4.0 还支持默认的行为配置
2.4.4 实例演示:经过tcpTrace进行消息路由(S205, S206)
2.5.1 链接请求的监听
2.5.2 消息分发
2014-09-25 WCF全面解析 第2章 Address