本文档提供了 Windows Communication Foundation (WCF) 体系结构的高级视图。 它旨在解释关键概念及其组合方式。 有关创建 WCF 服务和客户端的最简单版本的教程,请参阅 入门教程。 若要了解 WCF 编程,请参阅 基本 WCF 编程。
WCF 基础知识
WCF 是一个运行时和一组 API,用于创建在服务和客户端之间发送消息的系统。 同一基础结构和 API 用于创建与同一计算机系统或驻留在另一家公司的系统上与其他应用程序通信的应用程序,并通过 Internet 访问。
消息传送和终结点
WCF 基于基于消息的通信概念,可以建模为消息的任何内容(例如,HTTP 请求或消息队列(也称为 MSMQ)消息)都可以以统一的方式在编程模型中表示。 这可实现跨不同传输机制的统一 API。
该模型区分 客户端,即启动通信 的应用程序和服务,即等待客户端与其通信并响应通信的应用程序。 单个应用程序可以充当客户端和服务。 有关示例,请参阅双工服务和对等网络。
消息被发送至各个端点之间。 终结点 是发送或接收消息的位置(或两者),它们定义消息交换所需的所有信息。 服务公开一个或多个应用程序终结点(以及零个或多个基础结构终结点),客户端生成与服务终结点之一兼容的终结点。
终结点以基于标准的方法来描述应发送消息的方式、应发送消息的方式以及消息的外观。 服务可以将此信息公开为客户端可以处理的元数据,以生成相应的 WCF 客户端和通信 堆栈。
通信协议
通信堆栈的一个必需元素是 传输协议。 可以使用常见的传输(如 HTTP 和 TCP)通过 Intranet 和 Internet 发送消息。 也可以使用其他支持与消息队列应用程序和对等网络网格上的节点进行通信的传输协议。 可以使用 WCF 的内置扩展点添加更多传输机制。
通信堆栈中的另一个必需元素是指定如何设置任何给定消息格式的编码。 WCF 提供以下编码:
文本编码,是一种具有互操作性的编码。
消息传输优化机制(MTOM)编码,这是一种可互作的方式,用于有效地向/从服务发送非结构化二进制数据。
用于高效传输的二进制编码。
可以使用 WCF 的内置扩展点添加更多编码机制(例如压缩编码)。
消息模式
WCF 支持多种消息传送模式,包括请求-回复、单向和双工通信。 不同的传输支持不同的消息传送模式,从而影响它们支持的交互类型。 WCF API 和运行时还有助于安全地发送消息。
WCF 术语
WCF 文档中使用的其他概念和术语包括:
消息
可以包含多个部分(包括正文和标头)的自包含数据单元。
服务
一种结构,它公开一个或多个终结点,每个终结点又公开一个或多个服务操作。
终结点
发送或接收消息(或两者)的构造。 它包括一个定义可将消息发送到的位置(地址)、一个描述应如何发送消息的通信机制规范(绑定),以及对可在该位置发送和/或接收的一组消息的定义(服务协定,用于描述可发送哪些消息)。
WCF 服务作为端点的集合向外部公开。
应用程序终结点
由应用程序公开的终结点,对应于由应用程序实现的服务协定。
基础结构终结点
基础结构所公开的终结点,旨在帮助实现服务所需或提供的功能,这些功能不直接涉及服务合同。 例如,服务可能具有提供元数据信息的基础结构终结点。
地址
指定接收消息的位置。 它被指定为统一资源标识符(URI)。 URI 架构部分将用于访问地址的传输机制命名,例如 HTTP 和 TCP。 URI 的分层部分包含一个唯一位置,其格式依赖于传输机制。
通过终结点地址,可为服务中的每个终结点创建唯一的终结点地址,或者在某些情况下,跨终结点共享地址。 以下示例演示了将 HTTPS 协议与非默认端口配合使用的地址:
HTTPS://cohowinery:8005/ServiceModelSamples/CalculatorService
绑定
定义终结点如何与世界通信。 它构造了一组称为绑定元素的组件,其中一个位于另一个组件之上,用于创建通信基础结构。 至少,绑定定义传输(如 HTTP 或 TCP),以及所使用的编码(如文本或二进制)。 绑定可以包含绑定元素,这些元素指定用于保护消息的安全机制或终结点使用的消息模式等详细信息。 有关详细信息,请参阅 “配置服务”。
绑定元素
表示绑定的特定部分,例如传输、编码、基础结构级协议(如 WS-ReliableMessaging)的实现或通信堆栈的任何其他组件。
行为
一个组件,用于控制服务、终结点、特定操作或客户端的各种运行时方面。 行为按范围进行分组:常见行为全局影响所有终结点,服务行为仅影响与服务相关的方面,终结点行为仅影响终结点相关属性,操作级别行为影响特定操作。 例如,一种服务行为是限流,即指定当消息过多威胁到服务的处理能力时如何反应。 另一方面,终结点行为仅控制与终结点相关的方面,例如如何以及在哪里查找安全凭据。
系统提供的绑定
WCF 包含许多系统提供的绑定。 这些是针对特定方案优化的绑定元素的集合。 例如,WSHttpBinding 被设计为与实现各种 WS-* 规范的服务进行互操作。 这些预定义绑定仅提供可正确应用于特定方案的这些选项,从而节省时间。 如果预定义绑定不符合要求,则可以创建自己的自定义绑定。
配置与编码
可以通过编码、配置或两者的组合来控制应用程序。 配置的优点是允许除了开发人员之外的人(例如网络管理员)在代码编写后设置客户端和服务参数,而无需重新编译。 配置不仅使你可以设置终结点地址等值,还可以通过允许你添加终结点、绑定和行为来进一步控制。 通过代码编写,开发人员可以保持对服务或客户端的所有组件的严格控制,而且可以对通过配置完成的所有设置进行检查,并根据需要通过代码进行重写。
服务操作
在服务代码中定义的过程,用于实现某个操作的功能。 通过 WCF 客户端以方法的形式向客户端公开此操作。 该方法可以返回一个值,并且可以采用可选数量的参数,或者不采用任何参数,也不返回任何响应。 例如,一个实现简单的“Hello”的操作可以用作客户端存在通知,并可以开始一系列操作。
服务协定
将多个相关操作整合到一个功能单元中。 协定可以定义服务级别设置,例如服务的命名空间、相应的回调协定和其他此类设置。 在大多数情况下,协定是通过使用所选编程语言创建接口并将属性应用于 ServiceContractAttribute 接口来定义的。 通过实现该接口,可生成实际的服务代码。
操作合同
操作合同定义一个操作的参数和返回类型。 创建定义服务协定的接口时,可以通过将 OperationContractAttribute 属性应用于属于契约的每个方法定义来表示操作契约。 操作可以建模为获取单个消息并返回单个消息,也可以建模为获取一组类型并返回一个类型。 在后一种情况下,系统将确定需要交换该作的消息的格式。
消息协定
描述消息的格式。 例如,它说明消息元素应放入标头还是正文,以及消息的哪些元素需要应用什么级别的安全防护,等等。
故障责任合同
可以将错误协定与服务操作进行关联,以指示可能返回到调用方的错误。 一个操作可以具有零个或更多个与其相关联的错误。 这些错误是在编程模型中建模为异常的 SOAP 错误。
数据协定
服务使用的数据类型必须在元数据中进行描述, 这使其他人能够与服务进行互作。 数据类型可用于消息的任何部分,例如作为参数或返回类型。 如果服务仅使用简单类型,则无需显式使用数据协定。
托管
服务必须承载于某个进程中。
主机是控制服务的生存期的应用程序。 服务可以由现有托管进程自行托管或管理。
自托管服务
在开发人员创建的进程应用程序中运行的服务。 开发人员控制其生存期、设置服务的属性、打开服务(将其设置为侦听模式),并关闭服务。
托管进程
旨在承载服务的应用程序。 其中包括 Internet Information Services (IIS)、Windows 激活服务(WAS)和 Windows 服务。 在这些托管方案中,主机控制服务的生存期。 例如,使用 IIS 可以设置包含服务程序集和配置文件的虚拟目录。 收到消息后,IIS 将启动服务并控制其生存期。
实例化
每个服务都具有一个实例化模型。 有三种实例模型:“single”是指一个 CLR 对象服务所有客户端;“每次调用”是指为处理每次客户端调用而创建一个新的 CLR 对象;“每个会话”是指为每个单独会话创建一组 CLR 对象。 实例模型的选择取决于应用程序要求和服务的预期使用模式。
客户端应用程序
与一个或多个终结点交换消息的程序。 客户端应用程序首先创建 WCF 客户端的实例和调用 WCF 客户端的方法。 请务必注意,单个应用程序可以是客户端和服务。
通道
绑定元素的具体实现。 绑定表示配置,通道是与该配置关联的实现。 因此,有一个与每个绑定元素关联的通道。 通道堆栈相互堆叠,以创建绑定的具体实现:通道堆栈。
WCF 客户端
一个客户端应用程序结构,它在您选择的 .NET Framework 编程语言(如 Visual Basic 或 Visual C#)中将服务操作公开为方法。 任何应用程序都可以托管 WCF 客户端,包括托管服务的应用程序。 因此,可以创建包含其他服务的 WCF 客户端的服务。
WCF 客户端可以使用 ServiceModel 元数据实用工具工具(Svcutil.exe) 自动生成,并将其指向发布元数据的正在运行的服务。
元数据
服务的元数据描述服务的各种特征,外部实体需要了解这些特征以便与该服务进行通信。
ServiceModel 元数据实用工具 (Svcutil.exe) 可以使用元数据生成 WCF 客户端以及客户端应用程序用来与服务进行交互的附带的配置。
服务公开的元数据包括 XML 架构文档,这些文档定义服务的数据协定,以及描述服务方法的 WSDL 文档。
启用后,WCF 会通过检查服务及其终结点来自动生成服务的元数据。 若要从服务发布元数据,必须显式启用元数据行为。
安全性
在 WCF 中,包括机密性(用于防止窃听的消息加密)、完整性(检测篡改消息的方法)、身份验证(服务器和客户端验证手段)和授权(对资源的访问控制)。 这些函数通过利用现有的安全机制(例如 TLS over HTTP(也称为 HTTPS)或实现一个或多个各种 WS-* 安全规范来提供。
传输安全模式
指定传输层机制(如 HTTPS)提供机密性、完整性和身份验证。 使用 HTTPS 之类的传输时,此模式具有在性能上高效的优势,并因其在 Internet 上的流行性而得到充分理解。 缺点是,这种安全在通信路径中的每个跃点上单独应用,使通信容易受到“中间人”攻击。
消息安全模式
指定通过实现一个或多个安全规范(例如名为 Web Services 安全性:SOAP 消息安全性的规范)来提供安全性。 每个消息都包含在传输过程中提供安全性的必要机制,并使接收方能够检测篡改和解密消息。 从这个角度来说,安全性被封装在每条消息中,从而在多个节点之间提供端到端的安全保护。 由于安全信息成为消息的一部分,因此还可以将多种类型的凭据包含在消息中(这些凭据称为 声明)。 此方法还具有使消息能够安全地通过任何传输(包括其出发地和目的地之间的多个传输)的优势。 此方法的缺点是采用加密机制的复杂性,从而导致性能影响。
使用消息凭据安全模式传输
指定使用传输层来提供消息的机密性、身份验证和完整性,而每个消息可以包含消息接收方所需的多个凭据(声明)。
WS-*
一组不断增加的、在 WCF 中实现的 Web 服务 (WS) 规范(如 WS-Security、WS-ReliableMessaging 等)的简写。