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. MySQL的GRANT命令(创建用户)

    本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 (删除用户与删除权限:drop user '用户名 ...

  2. 关联规则( Association Rules)之频繁模式树(FP-Tree)

    Frequent Pattern Tree(频繁模式树)是Jiawei Han在2004年的文章<Mining Frequent Patterns without Candidate Gener ...

  3. Excle中range的一些用法

    以下是一些range的简单用法 Sub aa() '-=============================================== '给B列设置填充颜色为黄色 Range(" ...

  4. 物联网通信协议——比较-MQTT、 DDS、 AMQP、XMPP、 JMS、 REST、 CoAP

    物联网通信协议——比较-MQTT. DDS. AMQP.XMPP. JMS. REST. CoAP   AMQP & MQTT & DDS (https://www.youtube.c ...

  5. 阅读《Android 从入门到精通》(29)——四大布局

    LinearLayout 类方法 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQ ...

  6. RJ45接口定义

    RJ45接口定义 常见的RJ45接口有两类:用于以太网网卡.路由器以太网接口等的DTE类型,还有用于交换机等的DCE类型. DTE我们可以称做“数据终端设备”,DCE我们可以称做“数据通信设备”.从某 ...

  7. php_memcahed 安装

    1.下载服务端memcached软件 32bit:下载 memcached-win32-1.4.4-14.zip(直接下)里面包含6个文件,将解压后的文件夹随便放在什么位置(例如:D:\wamp_wi ...

  8. II7.5配置IIS支持2G文件下载

    IIS默认支持下载在20M让IIS7.5支持大文件下载,有两个地方 1.打IIS管理器->asp->点限制属性+->设置最大请求实体主体限制为2147483648 2.打开路径C:\ ...

  9. javascript 反调试 监听用户打开了Chrome devtool

    let div = document.createElement('div'); let loop = setInterval(() => {     console.log(div);     ...

  10. python之版本管理

    linux 环境下怎样对不同的python环境进行 方便的切换呢?update-alternatives工具能够非常方便的帮我们完成这个任务.而windows环境下可通过anaconda来完成. 1. ...