WCF入门
参考文章:http://wenku.baidu.com/view/d6caff42336c1eb91a375dbc.html
WCF概述:
A。WCF(Windows Communication Foundation,Windows通信基础)是微软基于 SOA(Service-Oriented Architecture,面向服务构架)推出的.Net 平台下的框架产品,它代表了软件架构设计与开发的一种发展方向。
B。WCF是微软分布式应用程序开发的集大成者,它整合了.Net平台下所有的和分布式系统有关的技术,例如.Net Remoting、ASMX、WSE和 MSMQ。
(注:WSE(Web Services Enhancements,Web服务增强) 是微软提供的一个实现了WS-Security, WS-Routing, WS-Attachments and DIME 等标准的组件(dll))
C。以通信(Communiation)范围而论,它可以跨进程、跨机器、跨子网、企业网乃至于 Internet;
以宿主程序而论,可以以 ASP.NET,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host)。
WCF可以支持的协议包括 TCP,HTTP,跨进程以及自定义,安全模式则包括 SAML,Kerberos,X509,用户/密码,自定义等多种标准与模式。
即在WCF框架下,开发基于 SOA的分布式系统变得容易了,微软将所有与此相关的技术要素都包含在内,掌握了 WCF就相当于掌握了叩开 SOA大门的钥匙。
例子:
假定我们要为一家汽车租赁公司开发一个新的应用程序,用于租车预约服务。该租车预约服务会被多种应用程序访问,包括呼叫中心(Call Center),基于 J2EE的租车预约服务以及合作伙伴的应用程序(Partner Application)。
呼叫中心运行在Windows平台下,是在.Net Framework 下开发的应用程序,用户为公司员工。由于该汽车租赁公司兼并了另外一家租赁公司,该公司原有的汽车预约服务应用程序是J2EE 应用程序,运行在非 Windows操作系统下。呼叫中心和已有的汽车预约应用程序都运行在 Intranet(企业内部网)环境下。 合作伙伴的应用程序可能会运行在各种平台下, 这些合作伙伴包括旅行社、航空公司等等,他们会通过 Internet来访问汽车预约服务,实现对汽车的租用。
这样一个案例是一个典型的分布式应用系统。如果没有 WCF,利用.Net 现有的技术应该如何开发呢?
A。首先考虑呼叫中心,它和我们要开发的汽车预约服务一样,都是基于.Net Framework 的应用程序。呼叫中心对于系统的性能要求较高,在这样的前提下,.Net Remoting是最佳的实现技术。它能够高性能的实现.Net 与.Net之间的通信。
B。要实现与已有的J2EE汽车预约应用程序之间的通信,只有基于 SOAP的Web Service可以实现此种目的,它保证了跨平台的通信;而合作伙伴由于是通过 Internet来访问,利用ASP.Net Web Service,即 ASMX,也是较为合理的选择,它保证了跨网络的通信。由于涉及到网络之间的通信,我们还要充分考虑通信的安全性,利用 WSE(Web Service Enhancements)可以为ASMX提供安全的保证。
C。一个好的系统除了要保证访问和管理的安全,高性能,同时还要保证系统的可信赖性。因此,事务处理是企业应用必须考虑的因素, 对于汽车预约服务而言, 同样如此。 在.Net中, Enterprise Service (COM+) 提供了对事务的支持, 其中还包括分布式事务 (Distributed Transactions) 。不过对于 Enterprise Service而言,它仅支持有限的几种通信协议。
D。如果还要考虑到异步调用、脱机连接、断点连接等功能,我们还需要应用 MSMQ(Microsoft Message Queuing),利用消息队列支持应用程序之间的消息传递。
如此看来,要建立一个好的汽车租赁预约服务系统,需要用到的.Net 分布式技术,包括.Net Remoting、Web Service,COM+等五种技术,这既不利于开发者的开发,也加大了程序的维护难度和开发成本。
从功能的角度来看,WCF完全可以看作是 ASMX,.Net Remoting,Enterprise Service,WSE,MSMQ等技术的并集。(注:这种说法仅仅是从功能的角度。事实上 WCF 远非简单的并集这样简单,它是真正面向服务的产品,它已经改变了通常的开发模式。)因此,对于上述汽车预约服务系统的例子,利用 WCF,就可以解决包括安全、可信赖、互操作、跨平台通信等等需求。开发者再不用去分别了解.Net Remoting,ASMX等各种技术了。
WCF Service的构成:
1。Service Class(服务类):一个标记了[ServiceContract]的类。
2。Host(宿主):它是WCF Service运行的环境。 可以是ASP.Net,可以是 Windows Service,也可以是一个普通的应用程序,例如控制台程序。
3。Endpoints(终结点):可以是一个,也可以是一组,它是WCF实现通信的核心要素。客户端和服务端通过它交换信息。
Endpoint的组成(ABC):
1。Address:是Endpoint的网络地址,它标记了消息发送的目的地。
2。Binding:描述的是如何发送消息,如传输协议(TCP/HTTP),安全(SSL/SOAP)。
3。Contract:描术的是消息所包含的内容,以及消息的组织和操作方式,如one-way,duplex和request/reply。
所以Endpoint 中的ABC分别代表的含义就是:where,how,what。
当WCF发送消息时,通过 address 知道消息发送的地址,通过 binding 知道怎样来发送它,通过 contract则知道发送的消息是什么。
消息交换模式(Message Exchange Patterns,MEPS):
在 WCF 中,服务端与客户端之间消息的交换共有三种模式:Request/Reply,One-Way,Duplex。
1、Request/Reply
这是默认的一种消息交换模式,客户端调用服务方法发出请求(Request),服务端收到请求后,进行相应的操作,然后返回一个结果值(Reply)。
如果没有其它特别的设置,一个方法如果标记了 OperationContract,则该方法的消息交换模式就是采用的 Request/Reply 方式, 即使它的返回值是 void。
2、One-Way
如果消息交换模式为 One-Way,则表明客户端与服务端之间只有请求,没有响应。即使响应信息被发出,该响应信息也会被忽略。这种方式类似于消息的通知或者广播。当一个服务方法被设置为 One-Way 时,如果该方法有返回值,会抛出 InvalidOperationException 异常。
要将服务方法设置为 One-Way 非常简单,只需要将 OperationContract的属性IsOneWay设置为true就可以了,如 [OperationContract(IsOneWay=true)] 。
3、Duplex
Duplex 消息交换模式具有客户端与服务端双向通信的功能,同时它的实现还可以使消息交换具有异步回调的作用。
要实现消息交换的Duplex,相对比较复杂。它需要定义两个接口,其中服务接口用于客户端向服务端发送消息,而回调接口则是从服务端返回消息给客户端,它是通过回调的方式来完成的。
服务类的标记类型用[ServiceContract],类中的方法标记类型用 [OperationContract]。
数据类的标记类型用[DataContract],类中的属性用[DataMember]。
A。服务类中的OperationContract和数据类中的DataMember一样,与它的访问限制修饰符(public,internal,private等)没有直接关系。即使该成员为 private,只要标记了OperationContract/DataMember,仍然可以被调用/序列化(被施加到 static 成员时,WCF 会忽略该DataMember)。
B。如果DataContract类中的 DataMember成员包含了泛型,那么泛型类型参数必须支持序列(基本类型,如int,可以被序列化)。
C。在DataMember中,提供了 Order属性,用以设置序列化后的XML的成员的顺序,如 [DataMember(Order = 1)] public string username;
附:WCF(webcast视频笔记):
如果没有WCF(使用WCF这一种技术,就可以实现其所有应用程序间的通信),应用程序可能要使用多种现有的.net framework技术(实现很复杂,维护也困难):
A。ASMX(能够共用的Web Services):因为目前大多数平台都支持基本的WEB服务,所以在WCF发布之前,这是实现跨供应商互操作性的最直接的方法。
B。.NET Framework远程处理(Remoting)(.NET间的通信):远程处理专门为紧密耦合的.NET到.NET通信而设计,因此它为本地网络中的应用程序提供了无缝而直接的开发体验。
C。企业服务(分布式应用):用来管理对象生存期和定义分布式事务。在与此应用场景中的任何其它应用程序通信和集成时,这些功能会很有用。
D。WSE(支持WS-*规范):可以ASMX一起使用,可提供更加灵活的WEB服务安全性。
E。Microsoft消息队列(MSMQ):用于与基于Windows的合作伙伴应用程序进行通信,这些应用程序对数据传送、工作量分离以及应用程序生存期均要求有保证。消息队列提供持久稳定的消息传送,这通常是间歇式连接的应用程序的最佳解决方案。
WCF的概述:
1。WCF可使用WEB服务进行通信,因此与同样支持SOAP的其他平台(如基于J2EE的主流应用程序服务器)间的互操作性就变得简单明了。
2。还可以对WCF进行配置和扩展,以便与使用并非基于SOAP的消息(例如像RSS这种简单的XML格式)的WEB服务进行通信。
3。性能是大多数业务中至关重要的考虑事项。开发WCF的目标就是要使之成为Microsoft所开发的速度最快的分布式应用程序平台之一。
4。当通信双方都建立在WCF上时,为获得最理的性能,XML信息集将被转成一个优化的二进制版本。
5。管理对象生存期、定义分布事务以及企业服务的其他方面的功能现在可以由WCF来提供。即,核心应用程序可以针对与之通信息的任何应用程序使用这些功能。
6。WCF支持一个大的WS-*规范集,因此可在同样支持这些规范的任何其他平台进行通信时帮助提供可靠性、安全性和事务。
7。建立在消息队列上的WCF排队消息选项使应用程序能够使用持久的排队,而无需使用另一组应用程序编程接口(如VB、C)。
WC提供统一的,可用于建立安全、可靠的面向服务的应用的高效开发平台。
将WEB服务的概念直接映射到.NET Framework公共语言运行库(CLR)中的对应内容,包括将消息灵活且可扩展地映射到用诸如C#或VB等语言实现的服务。该服务模型提供支持松耦合和版本管理的序列化功能,并提供与诸如消息队列(MSMQ)、COM+、ASP.NET WEB服务、WEB服务增强(WSE)等现在.NET Framework分布式系统技术以及很多其他功能的集成和互操作性。
WCF=System.Messaging+WSE+Remoting+ASMX+EnterpriseServices。
WCF设计目标:
1。生产效率:
A。统一了现有的各种分布式技术
B。基于属性(Attribute)的开发
C。与.net 2005的无缝集成
2。可交互性:
A。广泛地支持WS-*系列通用规范
B。与现有的微软分布式技术相兼容
3。面向服务的开发:
A。使用编写松散耦合的服务变得容易
B。服务的行为及属性(如通讯方式)可以通过配置来指定。
WCF编程的步骤:
1。创建服务接口:
A。using System.ServiceModel
B。接口类应用属性:ServiceContract,服务契约
C。接口中的公开方法应用属性:OperationContract,操作契约
D。接口外的复合类型(实体类)应用属性:DataContract,数据契约
2。实现服务接口(协定)。
3。通过指定终结点信息和其他行为信息来配置服务。
4。在应用程序中承载服务。
5。生成客户端应用程序。
第3、4、5,可参考文章:http://www.cnblogs.com/vipcjob/archive/2010/05/31/1748063.html