WCF基础知识

ironpython clr_IronPython 承载和消费WCF服务 是开始学习IronPython 的时候了文章里谈到了“IronPython 2.6提供了新特性clrtype,允许程序员用纯IronPython代码提供property、attribute等CLR类型信息。这样IronPython代码就可以无缝地与Sliverlight、WCF等框架集成。”我们就用clrtype来看看怎么承载WCF服务和消费WCF服务。WCF的契约需要定义接口,这是目前IronP... 阅读详情

1WCF是什么

WCF包含在。Net Framework当中。WCF并不能脱离.NET框架而单独存在,但非WCF客户端可以调用WCF务。

主要用于处理进程间乃至于机器之间消息的传递与处理,同时它引入了SOAservice-oriented architecture,SOA)的设计思想,以服务的方式公布并运行,以方便客户端跨进程和机器对服务进行调用

WCF就是微软对于分布式处理的编程技术的集大成者,它将DCOMRemotingWeb ServiceWSEMSMQ集成在一起,从而降低了分布式系统开发者的学习曲线,并统一了开发标准

 

.NET中一贯存在所谓宿主的概念,整个.NET Framework(或者说是CLR)就可以认为是一个大的宿主,就像Java的虚拟机一样。由于WCF对服务有着专门的需求,对于服务端,需要发布和运行服务;对于客户端,则需要调用服务;因而对于开发者,就需要编写定义、发布、运行、调用服务的相关代码。而服务就只能运行在特定的宿主上,这些宿主可以是控制台应用程序进程、WindowsWeb应用程序进程,也可以是Windows服务进程,或者为最常用的IIS宿主。

在宿主内部,则封装了通道堆栈,其中又包含了对协议、编码、消息传输、代理的处理。而在通道层的顶部,还提供了一个高级运行时,以针对应用程序的开发人员

大致组成如下图所示:

 

2WCF是怎样运行的

如果从宏观的角度来分析WCF的运行机制,它的实现并不复杂。WCF的体系架构是基于一种拦截机制来实现的,负责传递和拦截消息的组件为通道,在客户端发出对服务端服务的调用时,首先会通过一个服务代理对象,将调用方提供的对象序列化到消息中,然后该消息则通过通道进行传递。通道不只是包括一个,而是多个通道对消息进行处理,包括传输、消息编码、管理会话、传播事务等,但最底层的通道总是传输通道。这些通道的构成形成了一个通道堆栈。由于对象已经被序列化,因而此时通道传递的消息可以跨进程或机器进行传递,利用传输通道传递到服务端。服务端的构成与客户端基本相似,仍然是通过通道栈中最底层的传输通道接收消息,然后解析消息编码,并一层层地往上传输。在服务端的通道栈之上,则是一个分发器(Dispatcher,或者说是调度器),它会首先对消息进行检查,然后选择一个客户端要调用的操作。在这个过程中,消息会被反序列化。

     
下图说明了WCF的整个运行过程:

 

由于WCF通过通道的方式传递消息,整个通道同时担当了侦听器和拦截器的功能,它可以根据服务的定义,在方法执行的前或后执行不同的操作,例如事务、会话管理、安全等。这些操作在WCF中,大多数都可以以Attribute的方式应用到服务契约上,这样的实现方式,就类似于采用了AOP(面向服务编程)的方法为服务提供了大量的基础功能,有助于简化服务开发者的工作。

 

3、为什么我们要选用WCF

Windows平台下,尤其是在.NET平台下开发面向服务的应用程序,或者开发分布式系统,最佳选择就是WCF。为什么呢?原因就在于WCF涵盖了之前微软推出的所有用于分布式开发的技术,包括RemotingWeb ServicesWSEMSMQ等,并以一种统一的编程模式来实现

WCF既支持具有互操作性的Web服务,也能够实现.NET客户端与.NET服务端的通信,提供了分布式事务的支持,同时在安全性上,它完全遵循了WS-*的标准,此外,它还支持队列服务,可以非常方便地利用消息队列完成异步操作与脱机调用。而这些功能,以前的技术都只是部分的实现。如下表所示:

特性

  Web Service

  .NET Remoting  

  Enterprise Services  

   WSE   

  MSMQ  

  WCF

具有互操作性的Web服务

  支持

 

 

 

 

  支持

.NET到.NET的通信

 

  支持

 

 

 

  支持

分布式事务

 

 

  支持

 

 

  支持

支持WS标准

 

 

 

  支持

 

  支持

消息队列

 

 

 

 

  支持

  支持



      WCF
同时也使得面向服务编程更加简单而统一了。如果采用旧有的技术,由于各种技术的编程模型完全不一致,使得程序的迁移非常的困难。例如,最初采用.NET Remoting技术开发的分布式系统,由于业务需求的变化,要求发布具有互操作性的Web服务,就需要重新定义服务。并且,客户端的调用方式也发生了变化,需要添加Web引用,通过UDDI去发现服务。

     
采用WCF则不然。WCF引入了用通道,它封装了消息的通信细节,例如编码、事务处理、安全等,然后又通过引入绑定的概念,封装了通道的组成顺序与处理细节。最后,引入了独有的Endpoint元素,集成了地址、绑定和契约之间的三位一体,以最简单的方式定义和发布服务。

 

4WCF基础的技术要素有哪些

WCF的大部分功能都放在一个单独的程序集System.ServiceModel.dll中。WCF的几个最重要的技术元素包括:绑定、契约、端点。

     
如前所述,绑定封装了通道的组成顺序与处理细节,它直接决定了WCF的通信方式,消息的编码方式,通道的协议,消息传递的可靠性以及安全等内容。通过使用绑定,我们就无需了解消息在WCF通道中的实现细节,从而简化程序员的开发。正是因为此,WCF为开发人员提供了多个内置绑定,基本上涵盖了WCF应用的大部分场景。以下是Aaron Skonnard在《WCF深度绑定》一文中列举的内置绑定

绑定类名称

传输

  消息编码

消息版本

安全模式

可靠消息传送

事务流(默认情况下禁用)

BasicHttpBinding

HTTP

  文本

SOAP 1.1

不支持

不支持

WSHttpBinding

HTTP

  文本

SOAP 1.2 WS-Addressing 1.0    

消息

禁用

WS-AtomicTransactions

WSDualHttpBinding

HTTP

  文本

SOAP 1.2 WS-Addressing 1.0

消息

启用

WS-AtomicTransactions

WSFederationHttpBinding

HTTP

  文本

SOAP 1.2 WS-Addressing 1.0

消息

禁用

WS-AtomicTransactions

NetTcpBinding

TCP

  二进制

SOAP 1.2

传输

禁用

OleTransactions

NetPeerTcpBinding

P2P

  二进制

SOAP 1.2

传输

不支持

不支持

NetNamedPipesBinding

命名管道    

  二进制

SOAP 1.2

传输

不支持

OleTransactions

NetMsmqBinding

MSMQ

  二进制

SOAP 1.2

消息

不支持

不支持

MsmqIntegrationBinding

MSMQ

  不支持

(使用 WCF 之前的序列化格式)  

不支持

传输

不支持

不支持

CustomBinding

您决定

  您决定

您决定

您决定

您决定

您决定


     
每种绑定对应不同的传输协议、消息编码格式和版本以及安全、可靠性和事务模式。WCF也提供了扩展绑定的方式,例如通过CustomBinding或者定义派生与Binding的类。

WCF的契约包括服务契约、数据契约和消息契约(特别的,还包括了错误契约,用于异常的处理)。其中服务契约为面向服务应用程序的核心,通过它可以定义服务。数据契约则为服务所要传递的数据。由于服务的调用需要跨进程或机器进行通信,就需要服务数据必须能够被序列化和反序列化。虽然.NET本身提供了数据的序列化功能,但WCF的数据契约更加符合服务数据的定义习惯。至于消息契约,则可以将服务数据定义为消息,包括XML文本格式、MTOM(消息传输优化机制)格式和二进制格式。

     
绑定(Binding)、契约(Contract)与服务的地址(Address)组合在一起,则形成了终结点(Endpoint),如下图所示:

 


      Address
Endpoint的网络地址,它标记了消息发送的目的地。Binding描述的是如何发送消息,例如消息发送的传输协议(如TCPHTTP),安全(如SSLSOAP消息安全)。Contract则描述的是消息所包含的内容,以及消息的组织和操作方式,例如是单向,双向还是请求/响应方式。

     
引入终结点可以说是WCF的一个伟大创举,通过它使得我们能够更加容易的发布和管理服务,尤其是发布和管理多个服务。每个服务必须至少拥有一个终结点,而客户端正是通过终结点知道服务的相关信息,例如地址、消息编码格式、传输协议以及服务的内容,然后在进行正确的调用。最特别的是,同一个服务可以定义多个终结点,每个终结点可以是不同的地址、不同的绑定方式,以便于满足多个客户端的不同需要。而对于服务的发布者而言,我们只需要管理终结点的配置,就可以完成对服务的管理,这也为服务的托管提供了便利。


      

5WCF主要包含哪些内容?

      Juval
的《Programming WCF Services》一书基本已经涵盖了WCF技术的方方面面。概括来讲,主要包括绑定、服务契约、数据契约、消息传递、异常处理、实例模式、并发处理、事务处理、安全以及队列服务等。

     
绑定属于WCF基本的技术要素,是WCF进行通信处理的基础。了解绑定的相关知识,有助于开发WCF应用程序。因为在不同的业务需求下,可能对通信方式、协议、消息编码等多个方面会有不同的要求。在配制、发布和运行服务时,都需要对绑定进行操作。因而,我们必须掌握WCF内置绑定的相关属性,熟悉绑定元素的相关配置。此外,在一些高级应用上,我们还要掌握自定义绑定的方式,了解在自定义绑定时,添加绑定元素的方式与顺序,了解Binding基类的相关属性和方法。以及与绑定配置相关的类

     服务契约是WCF的主要处理对象,服务的定义和设置正是通过服务契约实现的。除了了解ServiceContractOperationContract的基础应用之外,还需要比较WCF服务编程与普通的.NET编程之间的区别,例如服务的继承与多态是怎样实现的。最重要的是如何根据SOA的思想划分服务的边界,确定服务的粒度大小,这需要从系统的易用性、可扩展性、性能等多个方面进行权衡。

     
服务契约中关于操作的定义要受到很多约束,其中最重要的就是对数据的处理,这也是WCF引入数据契约的目的。由于WCF的特殊性,因而我们需要了解一些特殊数据类型的序列化方式,例如泛型类型、集合、DataSet等。

     
约束服务操作定义的还包括对异常的处理,WCF对异常有一套特殊的处理方式,可以根据实际的情况,确定异常消息是否需要进行通信,以及出现异常时,是否要求停止服务实例,或继续维持会话。

      WCF
为消息传递提供了非常大的灵活性。它提供了专门的Message类以及相关的读写器,例如XmlDictionaryReaderXmlDictionaryWriter等对消息进行读写,这其中包含了对消息版本、编码格式、消息标头和正文等的操作。同时,WCF还提供了消息与方法之间的映射。在提供系统的互操作性时,了解WCF的消息传递方式很有必要。

     
根据不同的需求,WCF将实例模式分为PerCallSinglePerSession三种方式。通过设置服务行为的InstanceContextMode属性,来管理服务实例的生存周期,可以简化开发人员的工作。我们只需要了解这三种实例模式的特性即可。通常情况下,我建议服务采用PerCall模式,如果需要维持服务与客户端之间的会话,则可以采用PerSession模式。只有在对性能和可伸缩性没有太大要求的情况下,才可以采用Single模式。

     
关于事务处理、并发处理以及安全,主要都是通过相关的服务行为进行设置和管理。这些内容都是WCF高级应用所必需掌握的内容,尤其对于开发企业级应用系统而言。至于队列服务,主要是利用了消息队列,以实现系统可以脱机访问服务,并保持服务状态的同步

6WCF主用适用于哪些应用场景?

WCF
本身就是微软为了应对SOA[面向服务的体系结构(service-oriented architecture,SOA)]战略所推出的一套基于.NET Framework下的SDK。当我们在Windows平台下,基于.NET框架开发一套系统,同时要求这套系统需要与其它平台例如WebLogicWebSphere或者JBoss进行交互时,就需要采用WCF技术了。这是因为WCF的互操作性所决定的。

由于WCF集成了.NET编程开发的习惯,对于.NET开发人员而言,就大大地降低了学习曲线,此外,WCF保留了对旧有技术包括Web Service.NET RemotingMSMQWSE的支持,同时对于旧有技术到WCF的迁移也提供了非常好的解决方案。因而,如果.NET人员若要应用SOA的解决方案,那么WCF无疑就是最佳选择。单以开发而论,利用WCF定义服务、公开服务以及运行服务,利用WF实现工作流的设计、运行与管理、利用WPF作为具有丰富表现的富客户端,或者通过AJAX+SilverLight开发调用WCF服务的客户端,以及通过CardSpace完成对服务安全的设置与管理,就足以实施一整套的SOA解决方案。同时,WCF还可以结合Biztalk以及Sharepoint,使得SDK能够搭载于应用服务器之上,更大程度地满足企业应用的需要。

除了实施SOA解决方案之外,WCF对于开发分布式系统而言,也是得天独厚的。当我们的应用系统需要在多个服务器上运行不同服务,以支撑大量的访问负荷、大数据量处理、数据挖掘等工作时,就可以利用WCF开发不同的服务,然后托管在不同的服务器上,此时,整个系统就可以有效地利用服务器资源,减轻系统负荷


参考:
1
Juval Lowy著,张逸、徐宁译《WCF服务编程》
2
Aaron Skonnard,《WCF深度绑定》
3
Aaron Skonnard,《使用自定义行为扩展WCF
4
Boris Lublinsky,《实现一个.NET Web Services服务注册中心》

原文连接:http://www.cnblogs.com/wayfarer/archive/2008/04/15/1153775.html

 

WCF---预备知识 为了能正确理解并有效使用WCF,必须熟悉.NET Framework2.0和>NET CLR的一些功能特性。 ----摘自  Windows Communication Foundation Unleashed  分部类 (通俗来说 就是部分类) Microsoft Visual C# 2005开始允许一个类的定义由多个部分定义组成。这些部分定义可以分布到任意多个属于同一模块的源代码文件中。 阅读详情

相关推荐

关于WCF客户端编程技巧

客户端编程是很重要的部分,WCF经过长时间的发展,很多用户都很了解WCF了,这里我发表一下个人理解,和大家讨论讨论。为了调用服务上的操作,WCF客户端首先需要把服务合同导入到客户端的本地描述中。这意味着,该服务需要客户端暴露一个标准方法以检索它的元数据-这是通过让服务暴露一个元数据交换(MEX)端点来实现的。只要服务在宿主上注册至少一个TCP、HTTP或IPC基地址,那么,这个基于WCF的服务就能

wanmeizhushou的专栏 281

WCF基础知识总结

“学 以致用”,如果仅仅是希望能够在项目中合理地应用WCF,那么对于程序员而言,可以有两种选择,一种是“知其然而不知其所以然”,只要掌握了WCF的基础 知识,那么对于一般的应用就足够了。要做到这一点就很容易了,微软秉承了一贯的方式,将WCF这门技术优雅地呈现给开发者,封装了复杂的实现逻辑,提供了 易于调用的类库和相关的工具,使得开发者能够快速地完成WCF程序的开发。另外一种方式自然就是深度挖掘WC

_檬小呆的博客 2545

WCF的一些基础知识总结

之前在公司还没接触过WCF,但最近碰到一些需要WCF的地方。今天就简单总结写WCF基础知识。 一、WCF的契约类型有哪几种? 契约,就是指在使用WCF时,对其制定的各种各样的规则,就叫做WCF契约。任何一个分布式的应用程序在传递消息时都需要实现制定一个规则。 任何一个分布式应用程序,它之所以能够互相传递消息,都是事先制定好数据交换规则的,这个规则正是交换数据的双方。 WCF中制定的规则就...

u014677855的博客 836

WCF入门(一) WCF基础知识

WCF入门将和大家一起探讨以下内容: ①WCF基础知识,快速创建一个WCF应用程序。 ②WCF契约 ③WCF服务部署的实现 ④WCF的通信模式 ⑤WCF的调用模式 这一节,我们了解WCF基础知识WCF就是一种面向SOA的技术,是用来构建面向服务的应用程序框架,是微软开发的一组数据通信应用程序开发接口,可...

weixin_33878457的博客 183

[导入]WCF基础知识问与答

摘要: 学习WCF已有近两年的时间,其间又翻译了Juval的大作《Programming WCF Services》,我仍然觉得WCF还有更多的内容值得探索与挖掘。学得越多,反而越发觉得自己所知太少,直到现在,我也认为自己不过是初窥WCF的门径而已。“学以致用”,如果仅仅是希望能够在项目中合理地应用WCF,那么对于程序员而言,可以有两种选择,一种是“知其然而不知其所以然”,只要掌握了WC...

weixin_30609287的博客 72

初学WCF--最基础知识(1)

我们的ITOO,前台用的是MVC,后台是WCF --〉BLL --〉DLL-->EF。    我们都知道,MVC中的view是相当于显示数据记录的,controller是处理输入,通常控制器负责从视图中读取数据,控制用户输入,并可以向模型发送数据,我们的model是处理业务逻辑的,还负责在数据库中存取数据。看一下我们的前台的model层,是空的,也就是我们框架的前后台中的后台,也就是在这

飞翔的肥仔 3016

WCF基础知识问与答

WCF基础知识问与答 http://www.rainsts.net/article.asp?id=426 学习WCF已有近两年的时间,其间又翻译了Juval的大作《Programming WCF Services》,我仍然觉得WCF还有更多的内容值得探索与挖掘...

diaochejiang2761的博客 130

WCF 入门 WCF基础知识问与答

学习WCF已有近两年的时间,其间又翻译了Juval的大作《Programming WCF Services》,我仍然觉得WCF还有更多的内容值得探索与挖掘。学得越多,反而越发觉得自己所知太少,直到现在,我也认为自己不过是初窥WCF的门径而已。 学以致用”,如果仅仅是希望能够在项目中合理地应用WCF,那么对于程序员而言,可以有两种选择,一种是“知其然而不知其所以然”,只要掌握了WCF基础知识,那...

u014712365的博客 166

WCF 基础知识和术语表(MSDN)

WCF 基础知识 Windows Communication Foundation (WCF) 是一个运行库和一组 API,用于创建在服务与客户端之间发送消息的系统。它使用相同的基础结构和 API 来创建应用程序,这些应用程序可与同一计算机系统上或驻留在另一家公司内并通过 Internet 访问的系统上的其他应用程序进行通信。 消息和终结点 WCF 建立在基于消息的通信这一概念基础之...

weixin_30525825的博客 90

wcf基础知识之完结

在我以前的wcf博客中,我倾向于通过一个具体的问题来引出一个wcf的技术知识点,这得到了园友们的支持,我在这里向支持我的朋友们说声谢谢,谢谢你们的支持。但是也得到了很多的建议,今天有园友通过QQ联系我说,我讲的内容虽然说有知识点,但是知识点太分散,不能完整的理解wcf的各个知识点的作用以及相互之间的联系,我听后觉得很有道理,所以我放弃我以前的分散写wcf知识点的做法,改成一个系列一个系列的进行,这...

weixin_34273481的博客 130

wcf 基础教程 第一讲 wcf基础知识

最近工作有点忙,感觉有点累啊,很久没有更新博客了,看到自己的博客访问量日渐下降,我于心不忍,决定还是重新开博来吸引大家的关注。这次要说的不是别的,正是大名鼎鼎的wcf。或者在中间我会穿插MVC的说明,毕竟上一个系列MVC也没有写完就过年了,这次希望能坚持到底。呵呵 既然是基础,那我们就来了解一下wcf的前生今世。然后再用一个小实例说明一下就可以结束了。 SOA(面向服务的架构) 大家...

aini2749的博客 165

WCF入门教程:WCF基础知识问与答

<br />学习WCF已有近两年的时间,其间又翻译了Juval的大作《Programming WCF Services》,我仍然觉得WCF还有更多的内容值得探索与挖掘。学得越多,反而越发觉得自己所知太少,直到现在,我也认为自己不过是初窥WCF的门径而已。<br /><br />学以致用”,如果仅仅是希望能够在项目中合理地应用WCF,那么对于程序员而言,可以有两种选择,一种是“知其然而不知其所以然”,只要掌握了WCF基础知识,那么对于一般的应用就足够了。要做到这一点就很容易了,微软秉承了一贯的方式,将WCF

知而获智 709
上一篇: 17 Tips On Working At A Startup
下一篇: Scrum
lyrebing
博客等级 码龄19年 72粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值