契约 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. LeetCode29 Divide Two Integers

    题目: Divide two integers without using multiplication, division and mod operator. If it is overflow, ...

  2. C#中的预处理器指令详解

    这篇文章主要介绍了C#中的预处理器指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregio ...

  3. 跨平台轻量级redis、ssdb代理服务器(C++ 11编写)

    dbproxy 是我业余采用C++11编写的跨平台代理服务器(并使用lua和自己的网络库),以扩展系统负载,同时使用多个后端数据库,后端数据库支持redis和ssdb. 需要由用户自己编写lua脚本控 ...

  4. 常见的 HTTP错误代码大全

    一些常见的状态码为: - 服务器成功返回网页 - 请求的网页不存在 - 服务不可用 详细分解: 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 (继续) 请求者应当继 ...

  5. iOS 真机测试的一些报错

    1.连了手机热点 fix Issue后出现提示框:No Devices Registered:Creating a provisioning profile requires one or more ...

  6. python编写telnet登陆出现TypeError:'str' does not support the buffer interface

    python3支持byte类型,python2不支持.在python3中,telnet客户端向远程服务器发送的str要转化成byte,从服务器传过来的byte要转换成str,但是在python2不清楚 ...

  7. ASP.Net 验证控件 RequiredFieldValidator

    使用 ASP.NET 验证控件可在网页上检查用户输入.有用于各种不同类型验证的控件,例如范围检查或模式匹配验证控件.每个验证控件都引用网页上其他位置的输入控件(服务器控件).当处理用户输入时(例如,当 ...

  8. c#数组乱序,打乱数组

    按照random随机给出的index,进行两两交换,当然也存在与上一次一样的数组结果.官方还有一种ICompare的比较器,只是打乱顺序这个没用起来,不知道该怎么搞,╮(╯_╰)╭ public st ...

  9. echo,printr,print_r之间的区别

    echo 返回值是void,可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct)也就是关键字,而并不是真正的函数,因此不能作为表达式的一部分使用.使用的 ...

  10. OGNL 对象视图导航语言

    [Object Graphics Navigate Language] 类似于EL(Expression Language)表达式, 可以帮助我们在配置文件.JSP中来获取对象的值 这门语言比EL功能 ...