WCF中的Contracts

WCF通过Contract来说明服务和操作,一般包含五种类型的Contract:ServiceContract,OperationContract,FaultContract,DataContract,MessageContract。

1.ServiceContract

ServiceContract向外部暴漏了可以提供的服务接口,它可以包含服务名称、命名空间等服务器端的配置信息。

   1:  [ServiceContract]
   2:  interface IMyContract
   3:  {
   4:   [OperationContract]
   5:   string MyMethod();
   6:  }
   7:   
   8:  class MyService : IMyContract
   9:  {
  10:   public string MyMethod()
  11:   {
  12:   return "Hello World";
  13:   }
  14:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

2.OperationContract

OperationContract定义在ServiceContract的内部,定义了具体的服务操作。在此基础上,可以对操作的事务,绑定(One-way,Two-way等)和FaultContract信息。

   1:   [ServiceContract]
   2:   interface IMyContract
   3:   {
   4:   [FaultContract(typeof(MyFaultContract))]
   5:   [OperationContract]
   6:   string MyMethod();
   7:   }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

3.Data Contract

定义了服务器和客户端交互的内容,它可以标识类,以便作为OperationContract的参数或者返回类型。

   1:  [DataContract]
   2:  class Person
   3:  {
   4:   [DataMember]
   5:   public string ID;
   6:   [DataMember]
   7:   public string Name;
   8:  }
   9:   
  10:  [ServiceContract]
  11:  interface IMyContract
  12:  {
  13:   [OperationContract]
  14:   Person GetPerson(int ID);
  15:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

4.MessageContract

当OperationContract需要传递参数或者返回值时,可以使用MessageContract。它可以定义消息的Header和Body,以及安全性等。

   1:  [ServiceContract]
   2:  public interface IRentalService
   3:  {
   4:   [OperationContract]
   5:   double CalPrice(PriceCalculate request);
   6:  }
   7:   
   8:  [MessageContract]
   9:  public class PriceCalculate
  10:  {
  11:   [MessageHeader]
  12:   public MyHeader SoapHeader { get; set; }
  13:   [MessageBodyMember]
  14:   public PriceCal PriceCalculation { get; set; }
  15:  }
  16:   
  17:  [DataContract]
  18:  public class MyHeader
  19:  {
  20:   [DataMember]
  21:   public string UserID { get; set; }
  22:  }
  23:   
  24:  [DataContract]
  25:  public class PriceCal
  26:  {
  27:   [DataMember]
  28:   public DateTime PickupDateTime { get; set; }
  29:   [DataMember]
  30:   public DateTime ReturnDateTime { get; set; }
  31:   [DataMember]
  32:   public string PickupLocation { get; set; }
  33:   [DataMember]
  34:   public string ReturnLocation { get; set; }
  35:   }
  36:   

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

5.FaultContract

FaultContract定义了服务可能出现的异常信息,以及服务队错误的处理和错误信息抛出到客户端的内容。一个OperationContact可以包含0个或多个FaultContract。

   1:  [ServiceContract]
   2:  interface IMyContract
   3:  {
   4:   [FaultContract(typeof(MyFaultContract1))]
   5:   [FaultContract(typeof(MyFaultContract2))]
   6:   [OperationContract]
   7:   string MyMethod();
   8:   
   9:   [OperationContract]
  10:   string MyShow();
  11:   }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

MessageContract和DataContract的比较

区别

DataContract提供了一种将.net的CLR类型映射为可以被其他应用程序识别的基于W3C的Xml的方法,使得不同的应用间无须考虑对应使用的是什么类型的数据,而只需关注这些被抽象的Xml信息。

MessageContract则描述了SOAP消息的结构,最终在服务器和客户端进行传递,因此能够对SOAP信息的Header和Bodies进行直接的访问和处理,可以对复杂的类型进行处理。

为什么需要或者什么时候使用MessageContract

MessageContract一般只在你需要对消息体进行直接控制的时候使用,例如添加特定的Header,Footer等信息。在一些场合,如果需要在消息中包含Session相关的信息时,通过Header进行传递,则无需像消息体中增加额外的参数。或者有时你需要提供一个自定义的安全协议或者在应用间传递身份令牌。

当然,使用MessageContract时需要从SOAP Header中检索信息,而不是直接序列化后进行处理。

不要混用MessageContract和DataContract

对于一个OperationContract来说,不要在参数和返回值中分别使用MessageContract和DataContract,否则在生成WSDL时会引起运行时错误。

理解WCF中的Contracts的更多相关文章

  1. WCF初探-28:WCF中的并发

    理解WCF中的并发机制 在对WCF并发机制进行理解时,必须对WCF初探-27:WCF中的实例化进行理解,因为WCF中的并发特点是伴随着服务实例上下文实现的.WCF的实例上下文模型可以通过Instanc ...

  2. WCF初探-27:WCF中的实例化

    理解WCF中的实例化机制 “实例化”是指对用户定义的服务对象以及与其相关的 InstanceContext 对象的生存期的控制.也就是说我们的客户端程序在调用服务端方法时,需要实例化一个服务端代理类对 ...

  3. WCF初探-26:WCF中的会话

    理解WCF中的会话机制 在WCF应用程序中,会话将一组消息相互关联,从而形成对话.会话”是在两个终结点之间发送的所有消息的一种相互关系.当某个服务协定指定它需要会话时,该协定会指定所有调用(即,支持调 ...

  4. WCF技术剖析之十一:异步操作在WCF中的应用(下篇)

    原文:WCF技术剖析之十一:异步操作在WCF中的应用(下篇) 说完了客户端的异步服务调用(参阅WCF技术剖析之十一:异步操作在WCF中的应用(上篇)),我们在来谈谈服务端如何通过异步的方式为服务提供实 ...

  5. 理解WCF(第二部分,部分參考他人)

    該篇的主題:wcf到底是怎工作的? 一.什么是分布式: 首先看一张图: 由上图对比我们可以发现,区别就是前者把服务器放在了一台电脑上,而后者把服务器放在了多台电脑上.这样多台电脑处理起来的速度比一台电 ...

  6. WCF学习之旅—WCF中传统的异常处理(十六)

    WCF中的异常处理 在软件开发过程中,不可能没有异常的出现,所以在开发过程中,对不可预知的异常进行解决时,异常处理显得尤为重要.对于一般的.NET系统来说,我们简单地借助try/catch可以很容易地 ...

  7. 【WCF】WCF中的InstanceContext与ConcurrencyMode【转】

    一.前言 最近忙于公司的在线升级项目,一个人要负责公司四大产品的在线升级,这四个产品是在Revit中以插件形式存在的,目前基于WCF来实现.等客户总量突破5万了,再重新用socket实现. 由于有服务 ...

  8. 跟我一起学WCF(12)——WCF中Rest服务入门

    一.引言 要将Rest与.NET Framework 3.0配合使用,还需要构建基础架构的一些部件.在.NET Framework 3.5中,WCF在System.ServiceModel.Web组件 ...

  9. 跟我一起学WCF(10)——WCF中事务处理

    一.引言 好久没更新,总感觉自己欠了什么一样的,所以今天迫不及待地来更新了,因为后面还有好几个系列准备些,还有很多东西需要学习总结的.今天就来介绍下WCF对事务的支持. 二.WCF事务详解 2.1 事 ...

随机推荐

  1. 服务端REST与SOAP的探讨

    REST简介 在开始我们的正式讨论之前,让我们简单看一下REST的定义. REST(Representational State Transfer)是Roy Fielding提出的一个描述互联系统架构 ...

  2. SOA服务总线设计

    背景 基于总线的设计,借鉴了计算机内部硬件组成的设计思想(通过总线传输数据).在分布式系统中,不同子系统之间需要实现相互通信和远程调用,比较直接的方式就是“点对点”的通信方式,但是这样会暴露出一些很明 ...

  3. MongoDB数据库设计中6条重要的经验法则

    Part 1 原文:6 Rules of Thumb for MongoDB Schema Design: Part 1 By William Zola, Lead Technical Support ...

  4. ES6 Promise catch

    getJSON方法返回一个 Promise 对象,如果该对象状态变为resolved,则会调用then方法指定的回调函数:如果异步操作抛出错误,状态就会变为rejected,就会调用catch方法指定 ...

  5. python冒泡算法

    array = [1,2,3,6,5,4,28,2,1,9,3,0,200,2,9,3,2,98,33,988,22,0,223,0,33,78,222,88,32,0,238,883,2,0,23] ...

  6. Android版俄罗斯方块的实现

    学习Android的基本开发也有一段时间了,可是由于没有常常使用Android渐渐的也就忘记了. Android编程学的不深,不过为了对付逆向,可是有时还是会感到力不从心的.毕竟不是一个计算机专业毕业 ...

  7. js实现页面跳转的两种方式

      CreateTime--2017年8月24日08:13:52Author:Marydon js实现页面跳转的两种方式 方式一: window.location.href = url 说明:我们常用 ...

  8. 【VBA编程】08.数组

    [数组简介]数组其实就是一组相同类型的数据的有序集合,其形象表示就像线性表.在存储数据的时候,首先在内存中分配一个连续的存储空间,将各个元素按顺序存放在连续的存储单元格中.[定义静态数组]Dim 数据 ...

  9. DRUPAL性能优化【转】

    1.启用memcache代替Mysql的缓存表处理缓存数据. 2.添加一个opcode缓存可以让 PHP能够重用前面编译过的代码,这样就会跳过解析和编译.常见的opcode缓存有Alternative ...

  10. win10改win7如何设置bios教程

    情况一: 我们按del键(百度自己电脑.主板如何进入bios)进入主板bios后,我们通过键盘将选项移动到 Authentication 菜单(bios界面各不相同,可能不在此项,找到对应 secur ...