第一章、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快速实现自定义绑定。

《WCF全面解析》-上册 1-3章 读书笔记的更多相关文章

  1. <深入理解计算机系统>第七章读书笔记

    第七章读书笔记 链接 链接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.(这个文件可被加载或拷贝到存储器并执行) 链接可以执行于编译,加载或运行时. 静态链接: 两个主要任务: 1 符号 ...

  2. Linux内核分析第四章 读书笔记

    Linux内核分析第四章 读书笔记 第一部分--进程调度 进程调度:操作系统规定下的进程选取模式 面临问题:多任务选择问题 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这 ...

  3. 《Linux内核设计与分析》第四章读书笔记

    <内核设计与实现>第四章读书笔记 第四章:进程调度 进程(操作系统)程序的运行态表现形式. 进程调度程序,它是确保进程能有效工作的一个内核子系统. 调度程序负责决定将哪个进程投入运行,何时 ...

  4. 《构建之法》第四&十七章读书笔记

     <构建之法>第四&十七章读书笔记 一.         前言 再次阅读<构建之法>,愈发被其中生动有趣的举例吸引.作为一本给予软件工程学生的书籍,其不以枯燥的理论知识 ...

  5. linux内核分析第3章&第18章读书笔记

    linux内核分析第3章&第18章读书笔记 第三章 进程管理 进程:处于执行期的程序(目标码存放在某种存储介质上) 包含资源:可执行程序代码,打开的文件,挂起的信号,内核内部数据,处理器状态, ...

  6. MySQL必知必会1-20章读书笔记

    MySQL备忘 目录 目录 使用MySQL 检索数据 排序检索数据 过滤数据 数据过滤 用通配符进行过滤 用正则表达式进行搜索 创建计算字段 使用数据处理函数 数值处理函数 汇总数据 分组数据 使用子 ...

  7. Android驱动开发5-8章读书笔记

    Android驱动开发读书笔记                                                              第五章 S5PV210是一款32位处理器,具有 ...

  8. 【Tools】Pro Git 一二章读书笔记

    记得知乎以前有个问题说:如果用一天的时间学习一门技能,选什么好?里面有个说学会Git是个很不错选择,今天就抽时间感受下Git的魅力吧.   Pro Git (Scott Chacon) 读书笔记:   ...

  9. Linux内核分析第一二章读书笔记

    linux读书笔记(1,2章) 标签(空格分隔): 20135328陈都 第一章 Linux内核简介 Unix的历史 Unix 虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最 ...

  10. linux内核分析 1、2章读书笔记

    一.linux历史 20世纪60年代,MIT开发分时操作系统(Compatible TIme-Sharing System),支持30台终端访问主机: 1965年,Bell实验室.MIT.GE(通用电 ...

随机推荐

  1. Ubuntu14.04 下安装Samba服务

    1.更改linux镜像源: # vim /etc/apt/sources.list deb http://mirrors.163.com/ubuntu/ trusty main restricted ...

  2. javascript总结26:Date

    1 获取Date对象 Date-引用类型,JavaScript中的内置对象 获取当前时间 var date = new Date(); //UTC的时间 //返回数字,时间的毫秒形式 var date ...

  3. idea 启动报错问题

    Artifact SpiderServer:war exploded: Error during artifact deployment. See server log for details. 1. ...

  4. mybaits foreach

    <select id="selectQuickConsultDoctorList" resultMap="BaseResultMap" parameter ...

  5. review一个javascript功能函数

    近半年来一直觉得自己在技术上好像左右挣扎,技术没啥提升,看书看不进,自学还挺慢.写出来的东西,自己都觉得不满意.让自己也用庸人自扰的感觉. 最近,在工作中,有一个小小的功能需要实现,这个功能非常简单, ...

  6. opencv常用函数备忘

    //显示图片 IplImage * src = cvLoadImage("xx.JPG"); cvNamedWindow(); cvShowImage("show_ima ...

  7. 17、Semantic-UI之分页插件

      在很多的前端开发框架中都会有提供分页插件,但是分页插件的使用如果手动编写还是比较复杂的.使用Semantic-UI中的分页插件更加简单方便.分页插件的使用必须要和后台结合. 示例:定义分页插件 & ...

  8. TunnelBroker for EdgeRouter 后记

    最近入手了UBNT EdgeRouter X, 想着用 IPv6在路由上FQ,经过两天折腾,终于正常使用,留下点标记 供后来同学借鉴. TUNNEL的注册和配置,可以完全按这篇文章来: TunnelB ...

  9. 浅谈HTTPS以及Fiddler抓取HTTPS协议(摘抄)

    一.浅谈HTTPS 我们都知道HTTP并非是安全传输,在HTTPS基础上使用SSL协议进行加密构成的HTTPS协议是相对安全的.目前越来越多的企业选择使用HTTPS协议与用户进行通信,如百度.谷歌等. ...

  10. docker 命令大全

    http://www.runoob.com/docker/docker-command-manual.html