引言
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技术有了一个全面的认识,之后深入的理解就需要自己在项目中积累和实践了,希望通过这个系列也可以帮助到一些初学者。