WCF从理论到实践(3):八号当铺之黑色契约

 

本文的出发点:

通过阅读本文,能解决以下的问题

  1. 什么是契约?
  2. 契约有几种?,他们都有什么用途
  3. 如何定义契约?
  4. 契约是独立于平台的么?
  5. 契约和以往哪种技术比较相像,又有什么不同?

     

本文适合的读者

WCF的初学者,可以没有任何SOA或者其他分布式技术经验

 

什么是契约?

    任何一个分布式应用程序,它之所以能够互相传递消息,都是事先制定好数据交换规则的,这个规则正是交换数据的双方(比如服务器端和客户端)能彼此理解对方的依据,WCF作为分布式开发技术的一种,同样具有这样一种特性。而在WCF中制定的的规则就被称之为契约(Contract),它是WCF的消息标准,是任何一个wcf程序不可或缺的一部分。

 

契约有几种?,他们都有什么用途

在WCF中,契约分为四种,它们分别为:

  1. 用于定义服务操作的服务契约:Service Contract

    这种级别的契约又包括两种:ServiceContract和OperationContract

    ServiceContract用于类或者结构上,用于指示WCF此类或者结构能够被远程调用,而OperationContract用于类中的方法(Method)上,用于指示WCF该方法可被远程调用。

  2. 用于自定义数据结构的数据契约:Data Contract

    数据契约也分为两种:DataContract和DataMember.DataContract用于类或者结构上,指示 WCF此类或者结构能够被序列化并传输,而DataMember只能用在类或者结构的属性(Property)或者字段(Field)上,指示WCF该属性或者字段能够被序列化传输。

  3. 用于自定错误异常的异常契约:Fault Contract

    FaultContract用于自定义错误异常的处理方式,默认情况下,当服务端抛出异常的时候,客户端能接收到异常信息的描述,但这些描述往往格式统一,有时比较难以从中获取有用的信息,此时,我们可以自定义异常消息的格式,将我们关心的消息放到错误消息中传递给客户端,此时需要在方法上添加自定义一个错误消息的类,然后在要处理异常的函数上加上FaultContract,并将异常信息指示返回为自定义格式。

  4. 用于控制消息格式的消息契约:Message Contract

    简单的说,它能自定义消息格式,包括消息头,消息体,还能指示是否对消息内容进行加密和签名。

     

如何定义契约?

     其实上面落里罗嗦说了一大堆,似乎契约使用起来应该很难的样子了,可事实上,契约的使用是很简单的,它无非就是在普通的程序结构上添加一些声明性的属性就可以了,比如我们可以直接在类上声明ServerContractAttribute,此时这个类就能被远程客户端访问到,而在类中的方法中(Method)添加OperationContractAttribute就能将方法暴露给远程客户端,其他的契约也一样的用法,比较难得还是消息契约和错误契约,当也很简单。我这里没有WCF开发环境,所以具体怎么用,我就不做示例了,您仍不明白的话,可以参考下面几篇文章:

http://www.cnblogs.com/artech/archive/2007/02/28/659331.html

http://www.rainsts.net/article.asp?id=427

http://www.rainsts.net/article.asp?id=429

http://www.rainsts.net/article.asp?id=430

他们的blog中都有较详细的阐述和使用方法说明

 

契约是独立于平台的么?

    WCF作为一种能够跨平台的体系框架,其应用肯定会有异构,异网的情况发生,那么作为通讯依据的契约能否自动适用于上述情况呢?答案是肯定的,契约是独立于平台之外的,它只约束通讯的双方应该遵守什么样的规则,而丝毫不管双方各自采用的是什么样的技术和什么样的操作系统,也只有这样,WCF才能有真正的生命力。

 

契约和以往哪种技术比较相像,又有什么不同?

    如果非要拿契约和以往的技术相比较的话,契约和asp.net xml web service的声明性编程模型甚是相似,比如在web service中在类上标记WebServiceAttribute便可以将此类用于远程调用,而将方法添加WebMethondAttribute也可以将其暴露给远程客户端,这和WCF中的ServiceContract和OperationContract简直如出一辙,但不同的是,WCF中的契约要比Xml Web Service中的要详尽的多,比如ServiceContract和OperationContract可以直接使用在接口上面,而实现该接口的类就继承了这种契约声明,自动拥有契约所规范的动作和行为,这就使得程序员更方便的使用面向接口的编程方式,可以使同一服务拥有不同的实现,在新旧版本升级的同时,能够使新老版本共同运行。



本文的参考资料

http://www.cnblogs.com/artech/archive/2007/02/28/659331.html

http://www.rainsts.net/article.asp?id=427

http://www.rainsts.net/article.asp?id=429

http://www.rainsts.net/article.asp?id=430

http://www.cnblogs.com/wayfarer/archive/2006/04/10/370957.html
作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
标签: WCF, 契约
posted @ 2008-01-28 11:25 Robin Zhang 阅读(13922) 评论(22) 编辑 收藏

 回复 引用 查看   
#1楼 2008-01-28 12:06 周银辉      
好文~
 回复 引用 查看   
#2楼 2008-01-28 12:51 Allen Lee      
你也喜欢看《第八号当铺》?如果你的 WCF Service 使用的是“黑色契约”,那我就不访问了,呵呵~~~
 回复 引用 查看   
#3楼[楼主] 2008-01-28 13:38 jillzhang      
@Allen Lee
黑色还是白色不还是你说了算么
你这时候就是上帝,你想让他黑,他就黑,让他白,他就白呀

 回复 引用 查看   
#4楼[楼主] 2008-01-28 13:42 jillzhang      
@周银辉
周兄,昨天在ms的dev-wom颁奖party不知道您去了没?

 回复 引用   
#5楼 2008-01-28 15:59 awen177[未注册用户]
学习了
 回复 引用 查看   
#6楼 2008-01-29 09:19 Anytao      
张兄最近的动作好大呀,速度不一般:-)
 回复 引用 查看   
#7楼[楼主] 2008-01-29 09:24 jillzhang      
@Anytao
呵呵,最近刚刚腾出一些空闲时间来。总结一下去年一年的心得体会。大部分是瞎侃。
:)
你们在上海的的活动很成功,恭贺一下。

 回复 引用   
#8楼 2008-05-30 20:24 织诗_恒[未注册用户]
好~~~~
 回复 引用 查看   
#9楼 2008-09-25 10:07 sharezoon      
博主,没有对客户端公开的契约里的方法,为什么要放在契约里?当实现契约的时候直接实现不可以吗?比如契约里有M1,M2(对外公开)。当我在服务类里面实现契约的时候实现了M1 ,M2 ,同时我写了M3 。那么这个M1和M3有什么不同?什么情况下会出现这种情况?谢谢。

 回复 引用   
#10楼 2008-10-16 11:36 陈江[未注册用户]
好资料,正在慢慢学习中
 回复 引用   
#11楼 2008-12-17 10:32 ShadowFax[未注册用户]
最近在学习博主的很多篇文章。。。3Q3Q~
 回复 引用 查看   
#12楼 2009-03-09 10:08 itzsl      
写的很好,赞一个,楼主继续...
 回复 引用   
#13楼 2009-05-18 13:09 coljhoy
向楼主学习ing。。。什么时候能像你这么牛,哈哈。。。
 回复 引用 查看   
#14楼 2009-09-17 18:17 @华子      
简单易懂,赞一下。
 回复 引用 查看   
#15楼 2009-09-27 15:42 好好学习天天向上      
你好,我想问个问题,我想我的问题与WCF数据契约与序列化有关

我现在的项目有一个运行平台,它包括一个客户端和一个服务端,客户端与服务端之间通过WCF进行通讯,同时我们能通过运行平台的服务端组报文与后台的JAVA业务系统,通过WebService进行通信

现在我们组报文的方式是,通过在配置文件中配置XML路径以及对应实体的KEY值来获取数据,同时来组成XML字符串的. JAVA后台也用类似的方式序列反序列化对像组成报文

我觉得这种通过配置文件的方式,当处理不了太复杂的数结构,同时我们定义数据结构的时候需要跟JAVA后台人员约定数据结构.

我认为可以可以通过数据契约,让框架完成数据的序列化也就是XML字符串的生成.而开发人员只要专注于对像的定义,与使用.这样不论数据格式多复杂我只要通过定义对像定义我的数据结构.您在<WCF数据契约与序列化>
中写的示例是不是都是在微软技术的范围下,如果是异构的环境下,这种客户端与服务端之间本地代码的转换,怎么解决呢

就我现在的项目而言,因为这个运行平台是.NET技术实现的,通过WebService与JAVA后台通信,相对于JAVA后台它就是客户端,我应该无法使用WCF的契约.那我可不可以使用你在文章中说的"调用System.Runtime.Serialization.Formatters.Soap空间下的SoapFormatter类进行序列化和反序列化" 生成Soap消息与后台通信,
那么JAVA后台有没有方法反序列化,生成本地代码,同时保证前后台格式一至呢

 回复 引用 查看   
#16楼 2010-09-13 10:43 破-恶      
喜欢
 回复 引用 查看   
#17楼 2010-11-15 09:10 bug yang      
顶~
 回复 引用 查看   
#18楼 2011-04-30 09:25 Ti_Co      
只有一句话:严重支持!