惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
Know Your Adversary
Know Your Adversary
Google DeepMind News
Google DeepMind News
A
Arctic Wolf
P
Privacy & Cybersecurity Law Blog
云风的 BLOG
云风的 BLOG
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
Project Zero
Project Zero
L
LangChain Blog
N
News and Events Feed by Topic
博客园 - Franky
Last Week in AI
Last Week in AI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Scott Helme
Scott Helme
T
The Exploit Database - CXSecurity.com
P
Proofpoint News Feed
Blog — PlanetScale
Blog — PlanetScale
www.infosecurity-magazine.com
www.infosecurity-magazine.com
W
WeLiveSecurity
月光博客
月光博客
博客园_首页
美团技术团队
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
腾讯CDC
Latest news
Latest news
WordPress大学
WordPress大学
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Spread Privacy
Spread Privacy
Attack and Defense Labs
Attack and Defense Labs
量子位
L
LINUX DO - 热门话题
C
CERT Recently Published Vulnerability Notes
Webroot Blog
Webroot Blog
L
Lohrmann on Cybersecurity
aimingoo的专栏
aimingoo的专栏
T
Troy Hunt's Blog
Security Latest
Security Latest
小众软件
小众软件
Cloudbric
Cloudbric
Hacker News: Ask HN
Hacker News: Ask HN
S
Secure Thoughts
雷峰网
雷峰网
T
Threat Research - Cisco Blogs
H
Hacker News: Front Page
IT之家
IT之家
Simon Willison's Weblog
Simon Willison's Weblog

博客园 - laughter

使用Using的注意事项 [转]VMPlayer的Briged网络配置 [转]移动互联网应用技术架构简介-Restful服务 [翻译]在ASP.NET Web API中通过OData支持查询和分页 [转]NBehave行为驱动测试关于story和scenarios [转]使用TeamCity对项目进行可持续集成管理(一) [转]SpecFlow使用入门 [转]软件测试- 3 - Mock 和Stub的区别 [翻译]创建ASP.NET WebApi RESTful 服务(11) [翻译]创建ASP.NET WebApi RESTful 服务(10) [翻译]创建ASP.NET WebApi RESTful 服务(9) [转]模拟HttpContext 实现ASP.NET MVC 的单元测试 [翻译]创建ASP.NET WebApi RESTful 服务(8) [翻译]创建ASP.NET WebApi RESTful 服务(7) [转]软件开发过程(CMMI/RUP/XP/MSF)是与非? [转]比较 Rational Unified Process (RUP) 和 Microsoft Solutions Framework (MSF) [翻译]Behavior-Driven Development (BDD)行为驱动开发(二) [翻译]Behavior-Driven Development (BDD)行为驱动开发(一) 【Visual Studio2010】创建XAML分析插件
理解WCF中的Contracts
laughter · 2014-04-20 · via 博客园 - laughter

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:  }

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:   }

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:  }

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:   

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:   }

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时会引起运行时错误。