契约 Contract

WCF的所有服务都会公开为契约(Contract),契约与平台无关,是描述服务功能的标注方式。

服务契约(Service Contract)

  • 服务契约描述的是一个服务,它定义了 服务向外界公开的功能,这些功能表现为服务操作(Service Operation)。服务契约包括服务定义的各个方面、服务的操作、每个操作的消息交换模式以及每个操作使用的消息。

数据契约(Data Contract)

  • 数据契约定义了与服务交互的数据类型。
  • WCF把内建类型隐式定义为数据契约,也可以将自定义类型定义为数据契约

错误契约(Fault Contract)

  • 错误契约定义了服务抛出的错误,以及服务处理错误和传递错误到客户端的方式

消息契约(Message Contract)

  • 消息契约允许服务直接与消息交互,可以是类型化的,也可以是非类型化的。
  • 倘若消息交互的另一端规定了某些显式(通常是专有的)消息格式,在这种要求互操作性的场景下,消息契约将非常有用。

ServiceContract(服务协定)

全名:System.ServiceModel.ServiceContractAttribute

功能:指示接口或类在应用程序中定义服务协定。

简单一句话:标识此接口是否是服务协定,是否需要公开为服务。

详细:使用接口(或类)上的 ServiceContractAttribute 属性定义服务协定。然后使用一个或多个类(或接口)方法中的 OperationContractAttribute 属性定义协定的服务操作。实现服务协定后并将其与binding和 EndpointAddress 对象一起使用时,此服务协定将公开以供客户端使用。

使用规则:

  • ConfigurationName 属性指定要使用的配置文件中的服务元素的名称。
  • Name 和 Namespace 属性控制 WSDL <portType> 元素中的协定名称和命名空间。
  • SessionMode 属性指定协定是否需要支持会话的绑定。
  • CallbackContract 属性指定双向(双工)对话中的返回协定。
  • HasProtectionLevel 和 ProtectionLevel 属性指示是否所有支持协定的消息都具有一个显式 ProtectionLevel 值,如果有,处于什么级别。

OperationContract(操作协定)

全名: System.ServiceModel.OperationContractAttribute

作用:指示方法定义一个操作,该操作是应用程序中服务协定的一部分。

简单一句话:标识哪些操作属于服务协定一部分。如果不设置该属性,使用者则看不到此方法。

使用 OperationContractAttribute 属性控制该操作的结构以及以元数据表示的值:

  • Action 属性指定唯一标识该操作的操作。 根据请求消息的操作将它们调度至方法。
  • AsyncPattern 属性指示使用 Begin/End 方法对可以实现或异步调用该操作。
  • HasProtectionLevel 属性指示是否已显式设置 ProtectionLevel 属性。
  • IsOneWay 属性指示该操作只包含单个输入消息。该操作没有关联的输出消息。
  • IsInitiating 属性指定该操作是否可以是会话中的初始操作。
  • IsTerminating 属性指定该操作完成后, 是否试图终止当前会话。
  • ProtectionLevel 属性指定运行时操作要求的消息级安全性。
  • ReplyAction 属性指定该操作答复消息的操作。

DataContract(数据协定)

全名:System.Runtime.Serialization.DataContractAttribute

功能:指定该类型要定义或实现一个数据协定,并可由序列化程序(如 DataContractSerializer)进行序列化。若要使其类型可序列化,类型作者必须为其类型定义数据协定。

简单一句话:定义数据协定,用于数据传输。

DataMember(数据成员协定)

全名:  System.Runtime.Serialization.DataMemberAttribute

功能:指定该成员是数据协定的一部分并可由 DataContractSerializer 进行序列化。

简单一句话:标识数据协定的成员

FaultContract(错误契约)

默认情况下,服务抛出传递到客户端的异常均为FaultException类型,即使在服务器抛出FaultException<T>的情况下也是如此。其原因在与服务希望与客户端共享的基于错误之上的任何异常都必须属于服务契约行为的一部分,从而使得服务能够通知WCF它希望能够穿透错误的屏蔽。为此,WCF提供了错误契约,通过它可以列出服务能够抛出的错误类型。这些错误类型的类型参数应该与FaultException<T>使用的类型参数相同。只是他们在错误契约中列出,WCF客户端就能够分辨契约错误与其它错误之间的区别。

WCF 服务的ABC之契约(七)的更多相关文章

  1. WCF 服务的ABC之绑定(六)

    绑定 Binding 绑定是开发人员控制WCF程序与其他消息交互的主要手段.从功能上看,绑定创建了通道工厂惑通道侦听器的堆栈对象.绑定直接惑间接创建的对象是WCF实现各种消息功能(例如,传输.安全性. ...

  2. WCF 服务的ABC之地址(五)

    地址 Address 在WCF中,每个服务都有一个唯一的地址(Address). 地址包含两个重要的元素:服务位置及传输协议. 服务位置包含目标机器名.站点.通信端口.管道(或队列),以及一个可选的特 ...

  3. 基于MSMQ绑定的WCF服务实现总结

    一. 创建消息队列    1 1) 创建一个非事物性的私有队列    1 2)设置消息队列访问权限    2 二.创建WCF服务并绑定消息队列    4 1)创建HelloService服务    4 ...

  4. WCF学习笔记(2)——使用IIS承载WCF服务

    通过前面的笔记我们知道WCF服务是不能独立存在,必须“寄宿”于其他的应用程序中,承载WCF服务的应用程序我们称之为“宿主”.WCF的多种可选宿主,其中比较常见的就是承载于IIS服务中,在这里我们来学习 ...

  5. ajax调用handler,使用HttpWebRequest访问WCF服务

    引言 随着手机及移动设备的普及,移动端的应用也进入了热潮.以前PC端的门户网站,大多也均推出了适配移动设备的网站或者APP,再差的也注册了个公众号.在移动应用开发中,目前据我所了解到的解决方案有:1. ...

  6. WCF分布式开发步步为赢(6):WCF服务契约继承与分解设计

    上一节我们学习了WCF分布式开发步步为赢(5)服务契约与操作重载部分.今天我们来继续学习WCF服务契约继承和服务分解设计相关的知识点.WCF服务契约继承有何优势和缺点?实际项目里契约设计有什么原则和依 ...

  7. WCF服务编程 读书笔记——第2章 服务契约

    操作重载诸如 C++ 和 C# 等编程语言都支持方法重载,即允许具有相同名称的两个方法可以定义不同的参数.例如,如下的 C# 接口就是有效的定义: interface ICalculator { in ...

  8. WCF服务编程——数据契约快速入门

    WCF序列化流程 序列化 默认用户自定义类型(类和结构)并不支持序列化,因为.NET无法判断对象状态是否需要反射到流. 用户自定义类的实例支持序列化 需要添加[Serialazable].若要允许可序 ...

  9. WCF入门(七)---自托管消费WCF服务

    费自托管WCF服务的整个过程,一步步地解释以及充足的编码和屏幕截图是非常有必要. 第1步:服务托管,现在我们需要实现的代理类客户端.创建代理的方式不同. 使用svcutil.exe,我们可以创建代理类 ...

随机推荐

  1. C语言中将字符串转换为数字的方法

    C语言提供了几个标准库函数,可以将字符串转换为任意类型(整型.长整型.浮点型等)的数字.以下是用atoi()函数将字符串转换为整数的一个例子: # include <stdio. h># ...

  2. windows下 定时删除tomcat日志和缓存。可以保留天数

    forfiles /p "e:\Program Files\Tomcat 7.0\logs" /s /m *.log /d -5 /c "cmd /c del @path ...

  3. 通过继承nsoperation的方法--处理复杂任务

    #import <Foundation/Foundation.h> @class TTOperation; @protocol TTOperationDelegate <NSObje ...

  4. HTML笔记1

    HTML和css技术 HTML和css技术 html的介绍 网页的基本结构 今天学习的标签 标签属性 浏览器 DW快捷键 相对路径和绝对路径 HTML当中的颜色模式 网页当中常用的图片格式 html的 ...

  5. 【Linux/Ubuntu学习1】Linux /etc 目录详解

    /etc目录 包含很多文件.许多网络配置文件也在/etc 中. /etc/rc   or/etc/rc.d   or/etc/rc*.d   启动.或改变运行级时运行的scripts或scripts的 ...

  6. extjs中grid对于其中表单的表头的读取以及是否隐藏的判断

    //获取grid的表头信息 var columns=baseGrid.columns;                     alert(columns.length); //判断列是否隐藏并输出表 ...

  7. UITextField的简单操作和实际应用

    UITestField UITestField* testField = [UITestField alloc]initWithFrame]; /* 设置边框样式 typedef NS_ENUM(NS ...

  8. eclipse添加hadoop开发插件

    在开发hadoop的时候去查找了一下eclipse marketplace是没有找到hadoop的插件,上网又找了一下发现原来hadoop中其实是带有这样的插件的, 其实很简单只要将这个插件复制到ec ...

  9. DEDECMS 调用上级栏目标题

    在内容页,使用以下代码: {dede:field name='position' runphp='yes'} $tc="-"; //分隔符 $tw=$GLOBALS['cfg_li ...

  10. spring--事务原理

    Spring支持以下7种事务传播行为. 传播行为 XML文件 propagation值 含义 PROPAGATION_REQUIRED REQUIRED 表示当前方法必须在一个具有事务的上下文中运行. ...