# 跟我一起学WCF(13)——WCF系列总结
## 引言
WCF是微软为了实现SOA的框架,它是对微乳之前多种分布式技术的继承和扩展,这些技术包括Enterprise Service、.NET Remoting、XML Web Service、MSMQ等。WCF推出的原因在于:微软想将不同的分布式技术整合起来,提供一个统一的编程模型,这样对于开发者来说绝对是好事。在过去的2个月时间内,我陆续写了WCF系列文章,这些文章只是自己这段时间学习WCF内容的一个学习过程和笔记,希望通过这种写博文的方式记录下来和总结。本系列并没有对WCF机制做一个深入解析,只是讲解了WCF支持的功能和实现,关于更深入的了解,我相信,只有在项目中使用遇到问题和解决问题的方式才能更深入地理解,这系列文章只是想大家对WCF有一个全面的认识。下面是本系列文章的一个索引,希望可以帮助大家进行收藏,同时也帮助我自己索引。
### [第1篇] [跟我一起学WCF(1)——MSMQ消息队列](http://www.cnblogs.com/zhili/p/MSMQ.html)
MSMQ,Microsoft Message Queue——微软消息队列,它是微软之前实现分布式技术之一。其工作原理是:客户端将消息发送到一个消息队列中,服务从该消息队列中取出消息进行处理。通过消息队列的方式,把客户端和服务之间的耦合进行隔离,最明显的好处是异步和可离线功能,缺点是:由于客户端不直接把消息发送到服务进行处理,而是把消息发送到消息队列中,从而不适合客户端需要服务实时交互的情况下,大量请求的时候,响应可能延迟。
### [第2篇] [跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用](http://www.cnblogs.com/zhili/p/NETRemoting.html)
.NET Remoting是微软另一种分布式技术,WCF内部实现借鉴了该技术的实现。.NET Remoting优点可以实现跨应用程序域进行通信,缺点是不支持离线功能,并只适合.NET 平台的程序进行通信。其工作原理如下图所示:
![](https://box.kancloud.cn/2016-01-23_56a2eb46cfab9.gif)
### [第3篇] [跟我一起学WCF(3)——利用Web Services开发分布式应用](http://www.cnblogs.com/zhili/p/WebService.html)
XML Web Service是微软另外一种分布式技术,该技术具有的优点是跨平台,跨防火墙和自我描述,像MSMQ和.NET Remoting不能跨平台,因为其传输是二进制格式的数据,而XML Web Service传输的是基于XML的文本文件。其缺点是效率地和安全性,不适合做局域网内应用。所以,一般地说,局域网可以使用MSMQ和.NET Remoting技术,而基于Internet的应用使用XML Web Service。其实现原理如下图所示:
![XML Web services 生存期](https://box.kancloud.cn/2016-01-23_56a2eb4724588.gif)
### [第四篇] [跟我一起学WCF(4)——第一个WCF程序](http://www.cnblogs.com/zhili/p/FirstWCF.html)
之前说过,WCF是对MSMQ、.NET Remoting、XML Web Service等技术的继承和扩展,所以利用WCF既可以做基于局域网的应用,也可以做基于互联网的分布式应用。WCF最重要的概念就是终结点,服务的提供者将服务通过一个或多个终结点进行发布给服务消费者。而终结点又由地址、绑定和契约组成。
这三个要素在WCF通信中起到的作用分别是:
* **地址(Address)**:地址标识了服务的位置,提供寻址的辅助信息和标识了服务的真实身份。Address解决了**Where the WCF service?**的问题。
* **绑定(Binding)**:绑定实现了通信的所有细节,包括网络传输,消息编码,以及其他为实现某种功能对消息进行的相应处理,例如安全、可靠传输和事务等功能。 WCF中具有一系列的系统已定义的绑定,如BasicHttpBinding、WsHttpBinding、NetTcpBinding等。Binding解决了How to Communicate with Service?的问题。
* **契约(Contract)**:契约是对服务操作的抽象,也是对消息交互模式以及消息结构的定义。WCF的契约大体可以分为两类,一类是对服务操作的描述;另一类是对数据的描述。服务契约(Service Contract)则属于对服务操作的描述,而后一类包括其余3中契约:数据契约(Data Contract)、消息契约(Message Contract)和错误契约(Fault Contract)。Contract解决了What function does the Service Provide?的问题。
后面的WCF文章都是对于这三个元素的扩展介绍。
### [第五篇] [跟我一起学WCF(5)——深入解析服务契约[上篇]](http://www.cnblogs.com/zhili/p/WCFServiceContract.html)
定义WCF服务,自然第一步就是需要定义服务契约,该博文主要介绍了WCF如何实现操作重载的。其主要实现逻辑是为相同的方法定义别名,使其生成的WSDL中operation标签不同。
### [第六篇] [跟我一起学WCF(6)——深入解析服务契约[下篇]](http://www.cnblogs.com/zhili/p/WCFServiceContract2.html)
WCF如果服务中定义了契约的继承关系,通过客户端生成的代理类不会生成具有继承关系的契约结构,解决这个问题的思路就是自定义代理类,使其具有和服务契约中一样的继承结构。
### [第七篇] [跟我一起学WCF(7)——WCF数据契约与序列化详解](http://www.cnblogs.com/zhili/p/WCFDataContract.html)
数据契约是定义服务和客户端之间要传送的自定义类型,对于一些基本类型如String、int等内置类型都是可序列化的,所以WCF默认对这些类型可进行序列化并进行传输,但对于自定义类、结构体等类型,因为这些类型默认不支持序列化,WCF中通过DataMemberAttribute特性是自定义类型可以进行序列化传输,并在服务中能进行反序列化为对象来进行数据的处理。WCF中默认使用的序列化器是[DataContractSerializer](http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.datacontractserializer(v=vs.110).aspx)类。
### [第八篇] [跟我一起学WCF(8)——WCF中Session、实例管理详解](http://www.cnblogs.com/zhili/p/WCFInstanceManager.html)
WCF服务实例的管理借鉴了.NET Remoting技术的实现,同样有三种服务实例的激活方式:单调服务、会话服务和单例服务。
* **单调服务(Percall)**:为每个客户端请求分配一个新的服务实例。类似.NET Remoting中的SingleCall模式
* **会话服务(Persession)**:在会话期间,为每次客户端请求共享一个服务实例,类似.NET Remoting中的客户端激活模式。
* **单例服务(Singleton)**:所有客户端请求都共享一个相同的服务实例,类似于.NET Remoting的Singleton模式。但它的激活方式需要注意一点:当为对于的服务类型进行Host的时候,与之对应的服务实例就被创建出来,之后所有的服务调用都由这个服务实例进行处理。
WCF中服务激活的默认方式是PerSession,但不是所有的Bingding都支持Session,比如BasicHttpBinding就不支持Session。你也可以通过下面的方式使ServiceContract不支持Session。
### [第九篇] [跟我一起学WCF(9)——WCF回调操作的实现](http://www.cnblogs.com/zhili/p/WCFCallbackOperacation.html)
在WCF中,除了支持经典的请求/应答模式外,还提供了对单向操作、双向回调操作模式的支持,此外还有流操作的支持。本文介绍在WCF中回调操作的实现。
在WCF中,并不是所有的绑定都支持回调操作,只有具有双向能力的绑定才能够用于回调。例如,HTTP本质上是与连接无关的,所以它不能用于回调,因此我们不能基于basicHttpBinding和wsHttpBinding绑定使用回调,WCF为NetTcpBinding和NetNamedPipeBinding提供了对回调的支持,因为TCP和IPC协议都支持双向通信。为了让Http支持回调,WCF提供了WsDualHttpBinding绑定,它实际上设置了两个Http通道:一个用于从客户端到服务的调用,另一个用于服务到客户端的调用。
回调操作时通过回调契约来实现的,回调契约属于服务契约的一部分,一个服务契约最多只能包含一个回调契约。一旦定义了回调契约,就需要客户端实现回调契约。在WCF中,可以通过ServiceContract的[CallbackContract](http://msdn.microsoft.com/zh-cn/library/system.servicemodel.servicecontractattribute.callbackcontract(v=vs.110).aspx)属性来定义回调契约。
### [第十篇] [跟我一起学WCF(10)——WCF中事务处理](http://www.cnblogs.com/zhili/p/WCFTransaction.html)
WCF支持事务的传递,事务的传递方式由绑定的事务流属性([TransactionFlow](http://msdn.microsoft.com/zh-cn/library/system.servicemodel.nettcpbinding.transactionflow(v=vs.110).aspx)属性)、操作契约中的事务流选项([TransactionFlowOption](http://msdn.microsoft.com/zh-cn/library/system.servicemodel.transactionflowoption(v=vs.110).aspx)) 以及操作行为特性中的事务范围属性([TransactionScopeRequired](http://msdn.microsoft.com/zh-cn/library/system.servicemodel.operationbehaviorattribute.transactionscoperequired(v=vs.110).aspx))共同决定。WCF事务支持的四种传播模式是:Client/Service、Client、Service和None。下图是四种传播模式对应推荐的设置。
![](https://box.kancloud.cn/2016-01-23_56a2eb49694ba.png)
### [第十一篇] [跟我一起学WCF(11)——WCF中队列服务详解](http://www.cnblogs.com/zhili/p/WCFMSMQ.html)
既然WCF对之前多种分布式技术的继承和扩展,所以也自然支持可离线的功能,该文介绍了WCF中对队列服务的支持和实现。其实现方式与MSMQ的实现方式类似,只是WCF为队列服务提供了新的API支持,主要通过[MsmqIntegrationBinding](http://msdn.microsoft.com/zh-cn/library/system.servicemodel.msmqintegration.msmqintegrationbinding(v=vs.110).aspx)绑定类进行支持,其通信机制如下图所示:
![](https://box.kancloud.cn/2016-01-23_56a2eb49a1c68.png)
### [第十二篇] [跟我一起学WCF(12)——WCF中Rest服务入门](http://www.cnblogs.com/zhili/p/WCFRestService.html)
由Roy Thomas Fielding 在他的博士论文([“体系结构风格和基于网络软件体系的设计](http://ics.uci.edu/~fielding/pubs/dissertation/top.htm)”)中提出了Rest概念。Rest服务是将服务抽象为资源,每个资源都有一个唯一的统一资源标识符(URI),我们不再是通过调用操作的方式与服务进行交互了,而是通过HTTP标准动词(GET、POST、PUT和DELETE)的统一接口来完成。.NET 3.0之后,微软提供了新的API在WCF对Rest服务进行了支持,这些类包括WebHttpBinding类、WebGetAttribute、WebInvokeAttribute特性和WebServiceHost类。其实现方式和之前的WCF程序类似,只是使用新的API来对服务进行定义。
## 结束语:
到此,WCF系列也就告一段落了,通过对WCF技术系统的学习,我对WCF技术有了一个全面的认识,之后深入的理解就需要自己在项目中积累和实践了,希望通过这个系列也可以帮助到一些初学者。
- C# 基础知识系列
- C# 基础知识系列 专题一:深入解析委托——C#中为什么要引入委托
- C# 基础知识系列 专题二:委托的本质论
- C# 基础知识系列 专题三:如何用委托包装多个方法——委托链
- C# 基础知识系列 专题四:事件揭秘
- C# 基础知识系列 专题五:当点击按钮时触发Click事件背后发生的事情
- C# 基础知识系列 专题六:泛型基础篇——为什么引入泛型
- C# 基础知识系列 专题七: 泛型深入理解(一)
- C# 基础知识系列 专题八: 深入理解泛型(二)
- C# 基础知识系列 专题九: 深入理解泛型可变性
- C#基础知识系列 专题十:全面解析可空类型
- C# 基础知识系列 专题十一:匿名方法解析
- C#基础知识系列 专题十二:迭代器
- C#基础知识 专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
- C# 基础知识系列 专题十四:深入理解Lambda表达式
- C# 基础知识系列 专题十五:全面解析扩展方法
- C# 基础知识系列 专题十六:Linq介绍
- C#基础知识系列 专题十七:深入理解动态类型
- 你必须知道的异步编程 C# 5.0 新特性——Async和Await使异步编程更简单
- 全面解析C#中参数传递
- C#基础知识系列 全面解析C#中静态与非静态
- C# 基础知识系列 C#中易混淆的知识点
- C#进阶系列
- C#进阶系列 专题一:深入解析深拷贝和浅拷贝
- C#进阶系列 专题二:你知道Dictionary查找速度为什么快吗?
- C# 开发技巧系列
- C# 开发技巧系列 使用C#操作Word和Excel程序
- C# 开发技巧系列 使用C#操作幻灯片
- C# 开发技巧系列 如何动态设置屏幕分辨率
- C# 开发技巧系列 C#如何实现图片查看器
- C# 开发技巧 如何防止程序多次运行
- C# 开发技巧 实现属于自己的截图工具
- C# 开发技巧 如何使不符合要求的元素等于离它最近的一个元素
- C# 线程处理系列
- C# 线程处理系列 专题一:线程基础
- C# 线程处理系列 专题二:线程池中的工作者线程
- C# 线程处理系列 专题三:线程池中的I/O线程
- C# 线程处理系列 专题四:线程同步
- C# 线程处理系列 专题五:线程同步——事件构造
- C# 线程处理系列 专题六:线程同步——信号量和互斥体
- C# 多线程处理系列专题七——对多线程的补充
- C#网络编程系列
- C# 网络编程系列 专题一:网络协议简介
- C# 网络编程系列 专题二:HTTP协议详解
- C# 网络编程系列 专题三:自定义Web服务器
- C# 网络编程系列 专题四:自定义Web浏览器
- C# 网络编程系列 专题五:TCP编程
- C# 网络编程系列 专题六:UDP编程
- C# 网络编程系列 专题七:UDP编程补充——UDP广播程序的实现
- C# 网络编程系列 专题八:P2P编程
- C# 网络编程系列 专题九:实现类似QQ的即时通信程序
- C# 网络编程系列 专题十:实现简单的邮件收发器
- C# 网络编程系列 专题十一:实现一个基于FTP协议的程序——文件上传下载器
- C# 网络编程系列 专题十二:实现一个简单的FTP服务器
- C# 互操作性入门系列
- C# 互操作性入门系列(一):C#中互操作性介绍
- C# 互操作性入门系列(二):使用平台调用调用Win32 函数
- C# 互操作性入门系列(三):平台调用中的数据封送处理
- C# 互操作性入门系列(四):在C# 中调用COM组件
- CLR
- 谈谈: String 和StringBuilder区别和选择
- 谈谈:程序集加载和反射
- 利用反射获得委托和事件以及创建委托实例和添加事件处理程序
- 谈谈:.Net中的序列化和反序列化
- C#设计模式
- UML类图符号 各种关系说明以及举例
- C#设计模式(1)——单例模式
- C#设计模式(2)——简单工厂模式
- C#设计模式(3)——工厂方法模式
- C#设计模式(4)——抽象工厂模式
- C#设计模式(5)——建造者模式(Builder Pattern)
- C#设计模式(6)——原型模式(Prototype Pattern)
- C#设计模式(7)——适配器模式(Adapter Pattern)
- C#设计模式(8)——桥接模式(Bridge Pattern)
- C#设计模式(9)——装饰者模式(Decorator Pattern)
- C#设计模式(10)——组合模式(Composite Pattern)
- C#设计模式(11)——外观模式(Facade Pattern)
- C#设计模式(12)——享元模式(Flyweight Pattern)
- C#设计模式(13)——代理模式(Proxy Pattern)
- C#设计模式(14)——模板方法模式(Template Method)
- C#设计模式(15)——命令模式(Command Pattern)
- C#设计模式(16)——迭代器模式(Iterator Pattern)
- C#设计模式(17)——观察者模式(Observer Pattern)
- C#设计模式(18)——中介者模式(Mediator Pattern)
- C#设计模式(19)——状态者模式(State Pattern)
- C#设计模式(20)——策略者模式(Stragety Pattern)
- C#设计模式(21)——责任链模式
- C#设计模式(22)——访问者模式(Vistor Pattern)
- C#设计模式(23)——备忘录模式(Memento Pattern)
- C#设计模式总结
- WPF快速入门系列
- WPF快速入门系列(1)——WPF布局概览
- WPF快速入门系列(2)——深入解析依赖属性
- WPF快速入门系列(3)——深入解析WPF事件机制
- WPF快速入门系列(4)——深入解析WPF绑定
- WPF快速入门系列(5)——深入解析WPF命令
- WPF快速入门系列(6)——WPF资源和样式
- WPF快速入门系列(7)——深入解析WPF模板
- WPF快速入门系列(8)——MVVM快速入门
- WPF快速入门系列(9)——WPF任务管理工具实现
- ASP.NET 开发
- ASP.NET 开发必备知识点(1):如何让Asp.net网站运行在自定义的Web服务器上
- ASP.NET 开发必备知识点(2):那些年追过的ASP.NET权限管理
- ASP.NET中实现回调
- 跟我一起学WCF
- 跟我一起学WCF(1)——MSMQ消息队列
- 跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用
- 跟我一起学WCF(3)——利用Web Services开发分布式应用
- 跟我一起学WCF(3)——利用Web Services开发分布式应用
- 跟我一起学WCF(4)——第一个WCF程序
- 跟我一起学WCF(5)——深入解析服务契约 上篇
- 跟我一起学WCF(6)——深入解析服务契约 下篇
- 跟我一起学WCF(7)——WCF数据契约与序列化详解
- 跟我一起学WCF(8)——WCF中Session、实例管理详解
- 跟我一起学WCF(9)——WCF回调操作的实现
- 跟我一起学WCF(10)——WCF中事务处理
- 跟我一起学WCF(11)——WCF中队列服务详解
- 跟我一起学WCF(12)——WCF中Rest服务入门
- 跟我一起学WCF(13)——WCF系列总结
- .NET领域驱动设计实战系列
- .NET领域驱动设计实战系列 专题一:前期准备之EF CodeFirst
- .NET领域驱动设计实战系列 专题二:结合领域驱动设计的面向服务架构来搭建网上书店
- .NET领域驱动设计实战系列 专题三:前期准备之规约模式(Specification Pattern)
- .NET领域驱动设计实战系列 专题四:前期准备之工作单元模式(Unit Of Work)
- .NET领域驱动设计实战系列 专题五:网上书店规约模式、工作单元模式的引入以及购物车的实现
- .NET领域驱动设计实战系列 专题六:DDD实践案例:网上书店订单功能的实现
- .NET领域驱动设计实战系列 专题七:DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能
- .NET领域驱动设计实战系列 专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现
- .NET领域驱动设计实战系列 专题九:DDD案例:网上书店AOP和站点地图的实现
- .NET领域驱动设计实战系列 专题十:DDD扩展内容:全面剖析CQRS模式实现
- .NET领域驱动设计实战系列 专题十一:.NET 领域驱动设计实战系列总结