fyf

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

wcf 契约

Posted on 2009-04-17 14:25  fyf  阅读(302)  评论(0)    收藏  举报

      wcf中客户端和服务之间的数据交换需要一定的规则,这种规则就是契约。契约是与平台无关的,独立于平台。

      契约分为四种:

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

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

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

      一般情况下,我们用接口(Interface)来定义服务契约(Service Contract)。虽然我们也可以使用 Class,但使用接口的好处更明显一些。

      • 便于契约的继承,不同根的类型可以自由实现相同的契约。 

      • 同一服务类型可以实现多个契约。

      • 和接口隔离原则相同,我们随时可以修改服务类型。

      • 便于制定版本升级策略,让新老版本的服务契约同时使用。

 

以下是相关特性参数的简单说明。
ServiceContract

      • ConfigurationName: 其设置信息在配置文件中的名称。

      • Name / Namespace:自定义该服务契约的名称和命名空间。建议设置服务契约的 Name 和 Namespace,这样生成的客户端的代理文件会使用自定义名称来命名相关代理类型,即便我们日后对服务器端的契约名称进行重构也不会影响到客户端。

      • SessionMode:设置服务契约的 Session 方式,包括 Allowe、NotAllowed、Required。SessionMode 需要相应的 Binding 支持,默认情况下会自动启用,另外我们还会和 ServiceBehaviorAttribute.InstanceContextMode 配合使用来管理服务对象的生命周期。

      • CallbackContract:设置 duplex 模式时的回调类型。

      • ProtectionLevel:指定消息保护方式,可以对消息进行加密和签名处理。

OperationContract

      • AsyncPattern:用于定义异步服务方法。

      • IsInitiating:指示服务方法能否启动一个 Session。

      • IsTerminating:指示服务方法调用完成是否结束 Session。 

 

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

      数据契约也分为两种:DataContract和DataMember.

      DataContract用于类或者结构上,指示 WCF此类或者结构能够被序列化并传输,而DataMember只能用在类或者结构的属性(Property)或者字段(Field)上,指示WCF该属性或者字段能够被序列化传输。

      以下是相关特性参数的简单说明。

DataContract

      • Name / Namespace:自定义名称和命名空间。

DataMember

      • Name:自定义名称。

      • IsRequired:指示该成员序列化前必须被赋值。

      • Order:指定序列化后的排列位置

 

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

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

 

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

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