设计和实现服务
本节向您演示如何定义和实现 WCF 协定。服务协定指定终结点与外界通信的内容。更具体地说,它是有关一组特定消息的声明,这些消息被组织成基本消息交换模式 (MEP),如请求/答复、单向和双工。如果说服务协定是一组在逻辑上相关的消息交换,那么服务操作就是单个消息交换。例如,Hello
操作显然必须接受一条消息(以便调用方能够发出问候),并可能返回也可能不返回一条消息(具体取决于操作的礼节性)。
有关协定和其他核心 Windows Communication Foundation (WCF) 概念的更多信息,请参见Windows Communication Foundation 基础概念。本主题重点介绍对服务协定的理解。有关如何生成使用服务协定连接到服务的客户端的更多信息,请参见 WCF 客户端概述。
概述
本主题为 WCF 服务的设计和实现提供高级概念性阐释。子主题提供有关具体设计和实现内容的更为详细的信息。在设计和实现 WCF 应用程序之前,建议您:
- 了解什么是服务协定、服务协定的工作原理以及如何创建服务协定。
- 了解运行时配置或宿主环境可能不支持的协定状态最低要求。
服务协定
服务协定是承诺以下内容的声明:
- 一项服务中各种操作的分组方式。
- 针对交换的消息所进行的各种操作的签名。
- 这些消息的数据类型。
- 操作的位置。
- 用于支持与服务成功通信的特定协议和序列化格式。
例如,采购订单协定可能具有 CreateOrder
操作,该操作接受订单信息类型的输入并返回成功或失败信息,包括订单标识符。它还可能具有 GetOrderStatus
操作,该操作接受订单标识符并返回订单状态信息。此类服务协定需要指定:
- 采购订单协定由
CreateOrder
和GetOrderStatus
操作组成。 - 这些操作指定了输入消息和输出消息。
- 这些消息可以携带的数据。
- 有关成功处理消息所必需的通信基础结构的分类声明。例如,这些详细信息包括建立成功通信是否需要安全以及需要哪些形式的安全。
为了将这种信息传达到许多其他平台(包括非 Microsoft 平台)上的其他应用程序,XML 服务协定以标准 XML 格式公开表示,例如 Web Services 描述语言 (WSDL)(可能为英文网页)和 XML 架构 (XSD)(可能为英文网页)以及其他格式。许多平台的开发人员都可以使用此公共协定信息创建可与该服务通信的应用程序,既因为开发人员理解规范的语言,又因为这些语言通过描述服务支持的公共形式、格式和协议,支持互操作。有关 WCF 如何处理这类信息的更多信息,请参见元数据。
协定可以用多种方式进行表示,虽然 WSDL 和 XSD 语言非常适合以易于理解的方式描述服务,但这些语言很难直接使用,它们仅用于描述服务,而不能描述服务协定实现。因此,WCF 应用程序使用托管属性、接口和类来定义服务的结构并实现服务。
当客户端或其他服务实施者(特别是在其他平台上)需要时,可以以元数据(WSDL 和 XSD)的形式转换(也称为“导出”**)所得到的在托管类型中定义的协定。结果可以得到一个简单的编程模型,可以使用公共元数据向任何客户端应用程序描述该模型。基础 SOAP 消息的详细信息、传输和安全相关信息等可以留给 WCF 进行处理,它可以在服务协定类型系统和 XML 类型系统之间自动执行必要的转换。
有关设计协定的更多信息,请参见设计服务协定。有关实现协定的更多信息,请参见实现服务协定。
面向消息
如果您习惯于远程过程调用 (RPC) 样式的方法签名(其请求功能的标准形式为向某一方法传递参数,然后从对象或其他类型的代码接收返回值),则使用托管接口、类和方法模拟服务操作简单而直观。例如,使用托管语言(如 Visual Basic 和 C++ COM)的程序员可以运用 RPC 样式方法(不管是使用对象还是接口)方面的知识来创建 WCF 服务协定,而不会遇到 RPC 样式分布式对象系统中固有的问题。面向服务的优势是可以实现松耦合、面向消息的编程,同时保持轻松熟悉的 RPC 编程体验。
许多程序员感觉使用面向消息的应用程序编程接口更舒服,例如,像 Microsoft MSMQ 这样的消息队列、.NET Framework 中的 System.Messaging 命名空间或在 HTTP 请求中发送非结构化 XML。有关在消息级别编程的更多信息,请参见使用消息约定、服务通道级编程和与 POX 应用程序的互操作性。
了解要求的层次结构
服务协定对操作进行分组,指定消息交换模式、消息类型和消息携带的数据类型,并指示实现为了支持该协定而必须具有的运行时行为类别(例如,可能要求对消息进行加密和签名)。服务协定本身并未明确指定如何满足这些要求,而只是指定这些要求必须得到满足。加密类型或消息的签名方式取决于相容服务的实现和配置。
请注意协定为添加行为而对服务协定实现和运行时配置提出特定要求的方式。为了公开某一服务以供使用而必须满足的这组要求建立于前一组要求之上。如果协定对实现提出要求,那么实现可能会对配置和绑定提出更多的要求,以便使服务能够运行。最后,主机应用程序还必须支持服务配置和绑定所添加的任何要求。
在设计、实现、配置和承载 Windows Communication Foundation (WCF) 服务应用程序时必须要记住这一添加要求的过程。例如,协定可能会指定需要支持某一会话。如果是这样,您必须配置绑定以支持该协定性要求,否则服务实现将无法正常工作。或者,如果您的服务要求 Windows 集成身份验证并寄宿在 Internet 信息服务 (IIS) 中,则服务所在的 Web 应用程序必须打开 Windows 集成身份验证并关闭匿名支持。有关不同服务主机应用程序类型的功能和影响的更多信息,请参见承载服务。