《WCF全面解析》-上册 1-3章 读书笔记

第一章、WCF简介

ESB全称为Enterprise Service Bus,即企业服务总线。把所有的服务统筹到一个总线里面请求和分发,方便管理。

WCF(Windows Communication Foundation):分布式通讯架构,是面向服务架构的一种。WCF是遵循WS-*标准的,WS-*通过一系列的协议制定一套业界普遍遵循的Web服务标准。

SOA(Service-Oriented Architecture)概念(面向服务技术):SOA更像是一种标准,一种让不同的语言厂商开发的服务能进行相互通信的一种标准。

面向服务的核心:服务是自治的。服务的自治原则要求单个服务在底层逻辑控制方面尽可能是独立和自包含的,服务尽可能不依赖于访问它的客户端和其他服务。服务可以独立地进行部署及实施版本策略和安全策略。

WCF的服务不能独立地存在,需要寄宿于一个运行着的进程中,我们把承载WCF服务的进程称为宿主,为服务指定宿主的过程称为服务寄宿(Service Hosting)。寄宿方式一般有两种:①自我寄宿(Self-Hosting)(使用一个控制台) ②IIS寄宿(创建一个发布在IIS的Web服务)。

WCF的核心命名空间:System.ServiceModel

WCF采用基于终结点(Endpoint)的通信手段。终结点(Endpoint)由三要素组成:

①A(Address):地址决定了服务的位置,解决了服务寻址的问题。

②B(Binding):绑定实现了通信的所有细节,包括网络传输、信息编码,以及他为实现某种功能(比如传输安全、可靠消息传输、事务等)对详细进行的响应的处理。系统定义的绑定有BasicHttpBinding、WSHttpBinding、NetTcpBinding.

③Contract(契约):契约是对服务操作的抽象,也是消息交换模式及消息结构的定义。

简单的来说就是Endpoint=ABC

一个简单的WCF应用一般可以分割为下面4步操作:

①创建服务契约 抽象业务方法

②创建服务 实现契约里面的业务方法

③服务寄宿 服务寄宿有两种: ①自我寄宿 ②IIS寄宿

④调用服务 调用方法分为两种: ①通过引用自动生成服务代理   ②手动生成服务代理。客户端通过创建服务代理,然后通过终结点实现调用。

第二章、地址

http的默认端口是80

https默认的端口是443

WCF实现的额NetTcpBinding默认端口是808,传输协议的前缀是net.tcp

命名管道(Named Pipes):是Windows平台及UNIX系统下实现跨进程通信(IPC-Inter Process Communication  进程间通信)的实现标准。虽然命名管道本身可以实现跨机器的通信,但是WCF只将命名管道专用于同一台机器的通信,所以基于管道的URI的主机名称|域名|IP地址部分只能是本地的机器名称、localhost、127.0.0.1。WCF实现的命名管道的传输协议前缀是net.pipe

WCF基于消息队列的URI的协议前缀是net.msmq

终结点通过System.ServiceModel.Description.ServiceEndpoint类型表示。

寄宿服务添加终结点的方法有两种,一种是直接调用ServiceHostBase.AddServiceEndpoint()或者ServiceHost.AddServiceEndpoint()方法,另外一种是直接在配置文件配置终结点信息。

①EndpointAddress类型表示地址

EndpointAddress主要有三个属性:①.URI(服务定位)  ②AddressHeaderCollection(辅助寻址)  ③EndpointIdentity(身份识别)

②Binding表示绑定协议、

③ContractDescription表示契约

地址的三个典型功能:①服务标识/定位--通过Uri实现  ②辅助寻址--通过Headers实现 ③服务身份标识--通过Identity实现

因为WCF支持“基地址 + 相对地址”的方式进行设置。

基地址的概念是使用了不同的协议去实现的地址,每种协议的基地址只能有一个,例:"http://"开头的基地址就只能有一个,多个会报错。

如果是一个服务实现了多个契约的情况,创建终结点的时候,必须要绑定同一个绑定实例。

服务调用的本质是采用匹配的客户端终结点对目标终结点进行调用。所以ClientBase对象也是针对一个终结点建立的,它的地址、绑定、契约都有且只有一个。

调用服务的两个重点类ChannelFactory<>和ClientBase<>  实现调用服务,必须实现二者中的其中一个。

WCF的地址筛选策略:默认情况下,由于消息(SOAP)具有一个<To>报头标识调用服务的地址,被选择的终结点地址必须具有相匹配的Uri。如果终结点地址具有相应的地址报头,则要求请求消息也具有相应的报头。只有满足这两个条件的终结点才会最终被选择用于处理请求消息。

 当前的请求消息可以通过标识操作指定上下文的System.ServiceModel.OperationContext对象获取。类型为System.ServiceMode.Channels.MessageHeaders的IncomingMessageHeaders和OutgoingMessageHeader属性,分别标识入栈消息和出栈消息的报头列表。静态的Current属性标识当前的操作调用/执行上下文。

服务可以设置三种地址匹配方式(AddressFilterMode) ①Exact(精准匹配) ②Prefix(传入消息的地址执行最长前缀匹配的筛选器) ③Any(不对消息头做任何匹配)

端口共享:多个进程共享使用一个端口号,这就是端口共享。如果WCF需要实现端口共享,就需要使用到Net.Tcp绑定。

WCF下基于TCP的端口共享是建立在Net.TCP端口共享服务之上的,只要安装了.Net Framwordk 3.0及以上的操作系统都具有该服务。

特别说明,使用配置文件配置地址头的时候,要注意空格和回车符号。

行为在WCF仲是一个非常重要的概念,也是对WCF进行扩展的最为重要的方式。 行为一共分为4种:①.服务行为 ②终结点行为 ③契约行为 ④操作行为

①服务行为,就是绑定到相应的服务上面的行为,可以直接在 Behaviors节点=》ServiceBehaviors节点下面直接添加设置

②终结点行为,就是绑定到相应终结点的行为,可以直接在 Behaviors节点=>EnpointBehaviors节点下面直接添加设置。

③契约行为,

④操作行为,

客户端通过行为clientVia,实现逻辑地址和物理地址的分离。服务端可以通过ListenUri实现。

信道分发器(ChannelDispatcher)、信道监听器(ChannelListener)和终结点分发器(EndpointDispatcher)一起组成了WCF服务端的整个运行时框架体系。这三个实体类都在System.ServiceModel.Dispatcher命名空间内。

服务器端的监听地址个数和通信分发器、信道监听器的个数是相同的。终结点分发器和终结点的个数是相同的。

信道分发器进行请求的监听和消息的接收,终结点分发器最终完成对消息的处理。信道分发器接收的消息最终需要分发给相应的终结点分发器,而消息筛选解决了对终结点的选择问题。

终结点分发器有两个消息筛选器EndpointDisaptcher的:①AddressFilter属性和②ContractFilter 两个的类型都是MessageFilter。真正的信息筛选逻辑就定义在Match方法

第三章、绑定(Binding)

从基础架构的层次上划分,WCF可以划分为服务模型层(Service Model Layer)和信道层(Channel Layer)两个层次。服务模型层建立在信道层之上,提供了一个统一的,可扩展的编程模型。而信道层通过信道栈(Channel Stack)实现对消息的传输和处理。组成整个信道层的信道栈是由绑定创建的。绑定是连接两个层的纽带。

信道层:信道层就是一组信道(Channel)按照一定的顺序组成的信道栈,每个信道实现针对消息的某种处理功能。

对于客户端来说,服务模型层将经过序列化生成的消息传入信道层进行相应的处理后发送出去;信道层负责接收回复信息并将经过处理后的消息递交到服务模型层。服务端相反

典型的通过在消息交换过程中添加一些相应的消息处理操作来实现的功能:

①事务流转(Transaction Flowing):将客户端开始的事务流转到服务端,从而将服务的执行纳入该事务。

②安全传输(Transfer Security):保证数据包或消息的安全,避免被恶意篡改和窥视,同时解决客户端和服务身份认证问题。

③可靠传输(Reliable Messaging):在网络环境稳定的情况下保证数据包或消息的可靠、有序传输。

 信道按照提供功能的不同,可以分成3类。

①传输信道(Transport Channel):实现了基于某种网络协议(HTTP、HTTPS、TCP、MSMQ和Named Pipes等)的消息传输.

②消息编码信道(Message Encoding Channel): 实现了对消息的编码,常见的消息编码方式有Text/XML、Binary、MTOM。

③协议信道(Protocol Channel):实现了WCF对若干WS-*协议的支持,比如WS-Security、WS-RM、WS-AT等。

在WCF中,信道都是通过信道管理器(ChannelManager)创建。信道管理器其实就是服务端的ChannelListen类(信道监听器)和客户端的ChannelFactory类(信道工厂)。

信道管理器都对应着一个绑定元素(Binding Element)绑定元素负责相应信道管理器的创建。

WCF绑定模型设计多种类型的组件,比如信道、信道监听器、信道工厂等。这些通信对象都实现了System.ServiceModel.ICommunicationObject接口来统一管理状态和状态的装换方式(状态机)。ICommunicationObject具有一个System.ServiceModel.CommunicationState枚举类型的State属性标识当前通信的状态,状态有6种:①Created(创建)、②Opening(正被开启)、③Opened(已经被开启)、④Closing(正关闭)、⑤Closed(已关闭)、⑥Faulted(出错)。相应有5个事件,除了Created没有事件外,其他都有事件与之对应。

System.ServiceModel.IDefaultCommunicationTimeouts接口,分别有开启、关闭、发送、接收超时的时限。绑定模型基本都实现了这个接口。

每一种类型的信道都直接或者间接地实现了System.ServiceModel.Channel.IChannel接口。

消息交换模式(Message Exchange Pattern,MEP)在SOA中是一个重要的概念:MEP定义了参与者进行消息交换的模板,代表的是一系列的模板,定义了消息的发送者和接受者相互进行消息传输的次序。比较经典的消息交换模式包括数据报模式(Datagram)、请求-恢复模式(Request-Reply)和双工模式(Duplex)。

数据报模式(Datagram):数据报模式是最简单的消息交换模式,又称为发送/遗忘(Send/Forget)或单向(One-way)模式,基于一个源到一个或多个目的地的单向消息传输。消息的发送方将消息发送到接收方,并不希望收到对方的回复。一般采用异步的消息发送方式。

请求-回复模式(Request-Reply):请求-回复模式是使用最多的一种模式。在这种模式下消息发送方将消息发送给接收方后会等待对方的回复。一般采用同步的通信模式。

双工模式(Duplex):在进行消息交换过程中任何一方都可以向对方发送消息。双工通信使服务端回调客户端操作成为可能。比较典型的双工通信模式是订阅/发布模式。不同的网络传输协议对双工通信具有不同的支持方式。对TCP来说,协议本身就是全双工的网络通信协议,所以能够提供双工通信原生的支持。但是对于HTTP来说,它本身就是简单的基于请求-回复的网络协议,是不支持双工通信的。基于WSDualHttpBinding的双工通信实际上是采用两个关联的HTTP通道实现的。

订阅/发布模式:订阅方向发布方发送对某一主题的订阅请求,发布方接收到订阅消息后将订阅方添加到订阅列表中。主题发布的时候,发布方提取当前主题的所有订阅方,对它们警醒消息广播。

  MEP   消息发送方   消息接收方  
  数据报模式   IOutputChannel   IInputChannel  
  请求/回复模式       IRequestChannel   IReplyChannel
  双工模式   IDuplexChannel     IDuplexChannel

 从状态保持的角度,可以把信道分为数据报信道(Datagram Channel)和会话信道(Session Channel)。前者不需要保持具体的客户端(服务代理)的状态,因此多个客户端对象可以使用相同的信道;后者绑定一个客户端对象,并且与客户端对象具有相同的声明周期。

WCF中的会话(Session)标识在进行通信的参与者之间共享的上下文,会话通过消息关联(Message Correlation)的方式来实现。所谓的消息关联,就是发送自相同客户端的消息通过一个会话ID关联在一起。会话通过System.ServiceModel.Channels.ISession实现(仅仅有一个字符串ID属性)。会话信道都直接或者间接的实现了System.ServiceModel.Channels.ISessionChannel<TSession>,泛型TSession是ISession的实现。

信道监听器(服务端),当服务启动的时候,相应的信道监听器被开启并绑定到某个Uri进行请求的监听。信道监听器都实现了System.ServiceModel.Channels.IChannelListener接口。IChannelListener的延伸类有:IChannelListener<TChannel>、ChannelListenerBase抽象类和ChannelListenerBase<TChannel>抽象类

信道工厂(客户端),单纯地创建于发送请求和接受回复的信道。信道工厂都实现了System.ServiceModel.Channels.IChannelFactory接口。IchannelFactory的延伸类有:IChannelFactory<TChannel>泛型接口、ChannelFactoryBase抽象类和ChannelFactoryBase<TChannel>泛型抽象类。

绑定元素,就是一个绑定对象的元素。绑定元素根本的作用是创建信道监听器和信道工厂,从而创建信道栈。绑定元素的基类:System.ServiceModel.Channels.BindingElement抽象类。

绑定,绑定就是绑定元素的有序集合。绑定的基类: System.ServiceModel.Channels.Binding抽象类。核心方法是CreateBindingElements,通过这个方法实现对绑定元素的创建。

由于绑定的最终目标是实现对信道栈的创建,而对于一个信道栈来说,信道的构成和次序决定着该信道栈在最终消息通信中的特性和能力。绑定元素决定着信道的创建,所以绑定对象本身的特性和能力由自身包含的所有绑定元素及这些绑定元素的先后次序决定。举个栗子,WSHttpBinding的传输绑定元素是HttpTransportBindingElement,所以她只能支持基于HTTP或HTTPS的传输协议。如果需要确定某种类型的绑定是否支持事务流转,只需要看该绑定的绑定元素集合中是否包含TransactionFlowBindingElement就可以了。

 信道栈的创建:调用绑定的BuildChnnelListener<TChannel>和BuildChnnelFactory<TChannel>的时候,创建了指定信道类型的信道监听器和信道工厂管道。方法返回的是位于最顶端的信道监听器和信道工厂。然后会调用BindingContext里面的BuildInnerChannelListener<TChannel>和BuildInnerChannelFactory<TChannel>。当调用绑定的BuildInnerChannelListener<TChannel>(或BuildInnerChannelFactory<TChannel>)的时候,会获取BindingContext下面的RemainingBindingElements属性集合的第一个绑定元素并调用它的BuildChannelListener<TChannel>方法。与此同时,第一个绑定元素会从集合中移除。绑定元素将此BindingContext作为参数调用BuildChannelListener<TChannel>方法创建相应的信道监听器。而信道监听器创建的过程中又会调用BindingContext的BuildInnerChannelListener<TChannel>方法得到下一个信道监听器。由于第一个绑定元素已经从RemainingBindingElements集合中移除了,所以这次会使用第二个绑定元素来创建信道监听器。以此类推,所有的绑定元素都会被调用,它们创建的信道监听器按照绑定元素的顺序最终组成一个管道。信道工厂管道的创建与信道监听器的创建方式完全一致。

可以通过CustomeBinding快速实现自定义绑定。

原文地址:https://www.cnblogs.com/luoluoluoD/p/10645959.html