引言
WCF是微软为了实现SOA的框架,它是对微乳之前多种分布式技术的继承和扩展,这些技术包括Enterprise Service、.NET Remoting、XML Web Service、MSMQ等。WCF推出的原因在于:微软想将不同的分布式技术整合起来,提供一个统一的编程模型,这样对于开发者来说绝对是好事。在过去的2个月时间内,我陆续写了WCF系列文章,这些文章只是自己这段时间学习WCF内容的一个学习过程和笔记,希望通过这种写博文的方式记录下来和总结。本系列并没有对WCF机制做一个深入解析,只是讲解了WCF支持的功能和实现,关于更深入的了解,我相信,只有在项目中使用遇到问题和解决问题的方式才能更深入地理解,这系列文章只是想大家对WCF有一个全面的认识。下面是本系列文章的一个索引,希望可以帮助大家进行收藏,同时也帮助我自己索引。
[第1篇] 跟我一起学WCF(1)——MSMQ消息队列
MSMQ,Microsoft Message Queue——微软消息队列,它是微软之前实现分布式技术之一。其工作原理是:客户端将消息发送到一个消息队列中,服务从该消息队列中取出消息进行处理。通过消息队列的方式,把客户端和服务之间的耦合进行隔离,最明显的好处是异步和可离线功能,缺点是:由于客户端不直接把消息发送到服务进行处理,而是把消息发送到消息队列中,从而不适合客户端需要服务实时交互的情况下,大量请求的时候,响应可能延迟。
[第2篇] 跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用
.NET Remoting是微软另一种分布式技术,WCF内部实现借鉴了该技术的实现。.NET Remoting优点可以实现跨应用程序域进行通信,缺点是不支持离线功能,并只适合.NET 平台的程序进行通信。其工作原理如下图所示:
[第3篇] 跟我一起学WCF(3)——利用Web Services开发分布式应用
XML Web Service是微软另外一种分布式技术,该技术具有的优点是跨平台,跨防火墙和自我描述,像MSMQ和.NET Remoting不能跨平台,因为其传输是二进制格式的数据,而XML Web Service传输的是基于XML的文本文件。其缺点是效率地和安全性,不适合做局域网内应用。所以,一般地说,局域网可以使用MSMQ和.NET Remoting技术,而基于Internet的应用使用XML Web Service。其实现原理如下图所示:
[第四篇] 跟我一起学WCF(4)——第一个WCF程序
之前说过,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)——深入解析服务契约[上篇]
定义WCF服务,自然第一步就是需要定义服务契约,该博文主要介绍了WCF如何实现操作重载的。其主要实现逻辑是为相同的方法定义别名,使其生成的WSDL中operation标签不同。
[第六篇] 跟我一起学WCF(6)——深入解析服务契约[下篇]
WCF如果服务中定义了契约的继承关系,通过客户端生成的代理类不会生成具有继承关系的契约结构,解决这个问题的思路就是自定义代理类,使其具有和服务契约中一样的继承结构。
[第七篇] 跟我一起学WCF(7)——WCF数据契约与序列化详解
数据契约是定义服务和客户端之间要传送的自定义类型,对于一些基本类型如String、int等内置类型都是可序列化的,所以WCF默认对这些类型可进行序列化并进行传输,但对于自定义类、结构体等类型,因为这些类型默认不支持序列化,WCF中通过DataMemberAttribute特性是自定义类型可以进行序列化传输,并在服务中能进行反序列化为对象来进行数据的处理。WCF中默认使用的序列化器是DataContractSerializer类。
[第八篇] 跟我一起学WCF(8)——WCF中Session、实例管理详解
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回调操作的实现
在WCF中,除了支持经典的请求/应答模式外,还提供了对单向操作、双向回调操作模式的支持,此外还有流操作的支持。本文介绍在WCF中回调操作的实现。
在WCF中,并不是所有的绑定都支持回调操作,只有具有双向能力的绑定才能够用于回调。例如,HTTP本质上是与连接无关的,所以它不能用于回调,因此我们不能基于basicHttpBinding和wsHttpBinding绑定使用回调,WCF为NetTcpBinding和NetNamedPipeBinding提供了对回调的支持,因为TCP和IPC协议都支持双向通信。为了让Http支持回调,WCF提供了WsDualHttpBinding绑定,它实际上设置了两个Http通道:一个用于从客户端到服务的调用,另一个用于服务到客户端的调用。
回调操作时通过回调契约来实现的,回调契约属于服务契约的一部分,一个服务契约最多只能包含一个回调契约。一旦定义了回调契约,就需要客户端实现回调契约。在WCF中,可以通过ServiceContract的CallbackContract属性来定义回调契约。
[第十篇] 跟我一起学WCF(10)——WCF中事务处理
WCF支持事务的传递,事务的传递方式由绑定的事务流属性(TransactionFlow属性)、操作契约中的事务流选项(TransactionFlowOption) 以及操作行为特性中的事务范围属性(TransactionScopeRequired)共同决定。WCF事务支持的四种传播模式是:Client/Service、Client、Service和None。下图是四种传播模式对应推荐的设置。
[第十一篇] 跟我一起学WCF(11)——WCF中队列服务详解
既然WCF对之前多种分布式技术的继承和扩展,所以也自然支持可离线的功能,该文介绍了WCF中对队列服务的支持和实现。其实现方式与MSMQ的实现方式类似,只是WCF为队列服务提供了新的API支持,主要通过MsmqIntegrationBinding绑定类进行支持,其通信机制如下图所示:
[第十二篇] 跟我一起学WCF(12)——WCF中Rest服务入门
由Roy Thomas Fielding 在他的博士论文(“体系结构风格和基于网络软件体系的设计”)中提出了Rest概念。Rest服务是将服务抽象为资源,每个资源都有一个唯一的统一资源标识符(URI),我们不再是通过调用操作的方式与服务进行交互了,而是通过HTTP标准动词(GET、POST、PUT和DELETE)的统一接口来完成。.NET 3.0之后,微软提供了新的API在WCF对Rest服务进行了支持,这些类包括WebHttpBinding类、WebGetAttribute、WebInvokeAttribute特性和WebServiceHost类。其实现方式和之前的WCF程序类似,只是使用新的API来对服务进行定义。
结束语:
到此,WCF系列也就告一段落了,通过对WCF技术系统的学习,我对WCF技术有了一个全面的认识,之后深入的理解就需要自己在项目中积累和实践了,希望通过这个系列也可以帮助到一些初学者。
跟我一起学WCF(13)——WCF系列总结的更多相关文章
-
WCF开发实战系列一:创建第一个WCF服务
WCF开发实战系列一:创建第一个WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在这个实战中我们将使用DataContract,ServiceContract ...
-
WCF开发实战系列二:使用IIS发布WCF服务
WCF开发实战系列二:使用IIS发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们使用VS200 ...
-
WCF开发实战系列三:自运行WCF服务
WCF开发实战系列三:自运行WCF服务 (原创:灰灰虫的家 http://hi.baidu.com/grayworm)上一篇文章中我们建立了一个WCF服务站点,为WCF服务库运行提供WEB支持,我们把 ...
-
WCF开发实战系列四:使用Windows服务发布WCF服务
WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...
-
WCF开发实战系列五:创建WCF客户端程序
WCF开发实战系列五:创建WCF客户端程序 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在前面的三篇文章中我们分别介绍了WCF服务的三种载体:IIS.Self-Hos ...
-
WCF入门教程系列六
一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...
-
WCF分布式开发步步为赢(13):WCF服务离线操作与消息队列MSMQ
之前曾经写过一个关于MSMQ消息队列的文章:WCF分布式开发必备知识(1):MSMQ消息队列 ,当时的目的也是用它来作为学习WCF 消息队列MSMQ编程的基础文章.在那篇文章里,我们详细介绍了MSMQ ...
-
打算写一个《重学Node.js》系列,希望大家多多支持
先放上链接吧,项目已经开始2周了:https://github.com/hellozhangran/happy-egg-server 想法 现在是2019年11月24日,还有人要开始学习Node.js ...
-
一起学微软Power BI系列-使用技巧(2)连接Excel数据源错误解决方法
上一篇文章一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库中,我们介绍了Power BI Desktop中连接Oracle和Mysql的方法,其实说到底还是驱动的问题, ...
随机推荐
-
centos 配置固定ip
centos下网络配置方法(网关.dns.ip地址配置) 来源:互联网 作者:佚名 时间:07-13 00:32:07 [大 中 小] 本文介绍了centos网络配置的方法,centos网络配置主要包 ...
-
vim的ex模式用法
本文出自 http://blog.csdn.net/shuangde800 本文是在学习<使用vi编辑器, Lamb & Robbins编著>时在evernote写的其中一章笔 ...
-
【从0到1学Web前端】CSS伪类和伪元素
1.CSS中的伪类 CSS 伪类用于向某些选择器加入特殊的效果. 语法: selector : pseudo-class {property: value} CSS 类也可与伪类搭配使用 select ...
-
Extjs4.10Model模型具体解释
一.创建Model模型 Extjs4.10提供了两种方法来创建Model模型,也就是创建类 方法一: Ext.define('person',{ extend:'Ext.da ...
-
CSS中的盒模型
CSS的盒模型描述了一些长方形盒子,这些长方形盒子被用来表示文档树中的元素,并根据视觉格式化模型进行定位. 1. 盒子的尺寸 每个盒子都有一个content区域(比如文本.图片等)和可选的包围cont ...
-
VSCode jQuery代码提示
在VSCode中,ctrl+`打开终端: 运行命令: npm install @types/jquery --save 最后在项目中会生成: 说明安装成功! 详情可参见:链接
-
Linux中KVM桥接的配置
Linux中KVM桥接的配置 1. 原理 1.1 说明 在安装一个拥有虚拟化功能的Linux操作系统(此处以CentOS为例),一般我们有两种方法: .在光盘安装的时候安装好虚拟化包或者PXE服务器上 ...
-
第19章:MongoDB-聚合操作--聚合管道--$limit+$skip
①$limit “$limit”:负责数据的取出个数: “$skip”:数据的跨过个数. ②范例:使用“$limit”设置取出的个数
-
闭合浮动的方法css
浮动是一个有意思(你也可以说它很麻烦)的CSS属性,任何元素设置了浮动,层级就提高了,会影响它后面没设置浮动的元素,这些倒霉的被影响者会跑到浮动层的下面去(当然IE6.IE7除外),那解决方法呢? 常 ...
-
第三章 消息摘要算法--MD5
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第6章“验证数据完整性--消息摘要算法” 3.1.消息摘要算法:防止消息在传递过程中被篡改. 原理:任何消息经过消息摘要算法后 ...