概念概述
https://msdn.microsoft.com/zh-cn/library/ms731190(v=vs.110).aspx
本主题概括介绍有关 Windows Communication Foundation (WCF) 消息系统以及对该系统提供支持的类的信息。
WCF的简要概述
什么是Windows Communication Foundation
https://msdn.microsoft.com/zh-cn/library/ms731082(v=vs.110).aspx
Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架。 借助 WCF,可以将数据作为异步消息从一个服务终结点发送至另一个服务终结点。 服务终结点可以是由 IIS 承载的持续可用的服务的一部分,也可以是应用程序中承载的服务。 终结点可以是从服务终结点请求数据的服务客户端。 简单消息可以是作为 XML 发送的单个字符或单个单词,复杂消息可以是二进制数据流。 一些示例方案包括:
-
处理企业事务的安全服务。
-
将当前数据提供给其他服务(例如流量报告或其他监视服务)的服务。
-
使两个人能够实时通信或交换数据的聊天服务。
-
轮询一个或多个服务以查找数据并将其以逻辑表现形式展示出来的面板应用程序。
-
将使用 Windows Workflow Foundation 实现的工作流作为 WCF 服务公开。
-
轮询服务以查找最新数据源的 Silverlight 应用程序。
虽然在 WCF 存在之前就可以创建此类应用程序,但 WCF 使终结点的开发比以前更容易。 总之,WCF 设计提供一种用于创建 Web 服务和 Web 服务客户端的可管理的方式。
WCF 包括以下功能集。 有关详细信息,请参见WCF 功能详细信息。
-
服务导向
使用 WS 标准的一个结果是,WCF 允许您创建面向服务的应用程序。 面向服务的体系结构 (SOA) 依赖 Web 服务发送和接收数据。这些服务具有松耦合的常规优点,而不是从一个应用程序到另一个应用程序进行硬编码。 松耦合关系意味着只要符合基本协定,则在任何平台上创建的任何客户端均可连接到所有服务。
-
互操作性
WCF 实现了 Web 服务互操作性的现代行业标准。 有关以下内容的详细信息支持的标准,请参见互操作性和集成。
-
多种消息模式
采用多种模式之一交换消息。 最常用的模式是请求/答复模式,其中一个终结点从另一个终结点请求数据, 另一个终结点进行答复。 还有其他模式,比如单向消息,其中只有一个终结点发送消息,而不期望得到答复。 更复杂的模式是双工交换模式,在该模式下,两个终结点建立连接并来回发送数据,类似于即时消息传递程序。 有关以下内容的详细信息如何使用 WCF 实现不同的消息交换模式,请参见协定。
-
服务元数据
WCF 支持使用行业标准(如 WSDL、XML 架构和 WS-Policy)中指定的格式发布服务元数据。 该元数据可用于自动生成并配置客户端,以便访问 WCF 服务。 可通过 HTTP 和 HTTPS 来发布元数据,也可使用 Web 服务元数据交换标准来发布元数据。 有关详细信息,请参见元数据。
-
数据协定
由于 WCF 是使用 .NET Framework 生成的,因此它也包括代码友好的方法,用于提供希望强制执行的协定。 数据协定就是其中一种通用类型的协定。 实质上,当您使用 Visual C# 或 Visual Basic 对服务进行编码时,处理数据的最简单方法是使用属于数据实体的属性创建表示该数据实体的类。 WCF 包括一个以这种轻松的方式处理数据的综合系统。 在创建了表示数据的类之后,服务会自动生成使客户端能够符合所设计数据类型的元数据。 有关详细信息,请参见使用数据协定。
-
安全性
可对消息进加密以保护隐私,而且可以要求用户对其自身进行身份验证,然后才允许接收消息。 可使用众所周知的标准(如 SSL 或 WS-SecureConversation)实现安全性。 有关详细信息,请参见Windows Communication Foundation 安全性。
-
多种传输和编码方式
可通过多种内置传输协议和编码中的任意一种发送消息。 最常用的协议和编码是使用超文本传输协议 (HTTP) 发送文本编码的 SOAP 消息,以便在万维网上使用。 此外,WCF 还允许通过 TCP、命名管道或 MSMQ 发送消息。 这些消息可以编码为文本,也可以使用优化的二进制格式。 使用 MTOM 标准可有效地发送二进制数据。 如果所提供的传输或编码都不符合您的需要,您可以创建自己的自定义传输或编码。 有关以下内容的详细信息 WCF 支持的传输和编码的信息,请参见 Windows Communication Foundation 中的传输。
-
可靠的排队消息
WCF 支持使用通过 WS-Reliable Messaging 实现的可靠会话和使用 MSMQ 进行可靠的消息交换。 有关以下内容的详细信息 WCF 中可靠和排队的消息支持,请参见队列和可靠会话。
-
持久性消息
持久性消息决不会由于通信中断而丢失。 持久性消息模式的消息会始终保存到数据库中。 如果发生中断,数据库将允许您在恢复连接后恢复消息交换。 此外,也可以使用 Windows Workflow Foundation (WF) 来创建持久性消息。 有关详细信息,请参见工作流服务。
-
事务
WCF 还使用三个事务模型之一来支持事务:WS-AtomicTtransactions、System.Transactions 命名空间中的 API 以及 Microsoft 分布式事务协调器。 有关以下内容的详细信息 WCF 中的事务支持,请参见WCF 中的事务。
-
AJAX 和 REST 支持
REST 是不断发展的 Web 2.0 技术的一个示例。 WCF 可以配置为处理未包装在 SOAP 信封中的“纯文本”XML 数据。 WCF 还可以扩展以支持特定的 XML 格式,如 ATOM(流行的 RSS 标准),甚至支持非 XML 格式(如 JavaScript 对象表示法 (JSON))。
-
扩展性
WCF 体系结构具有大量扩展点。 如果需要额外功能,它还提供许多入口点,允许您自定义服务的行为。 有关以下内容的详细信息可用扩展点,请参见扩展 WCF。
WCF 是一个灵活的平台。 由于这一极强的灵活性,WCF 还在 Microsoft 的一些其他产品中得以利用。 如果您也在使用这些产品中的任何产品,通过了解 WCF 的基础知识,您会立即受益。
与 WCF 配对的第一项技术是 Windows Workflow Foundation (WF)。 工作流通过将工作流中的步骤封装为“活动”来简化应用程序开发。 在 Windows Workflow Foundation 的第一个版本中,开发人员必须为工作流创建主机。 Windows Workflow Foundation 的下一版本与 WCF 进行了集成, 从而允许在 WCF 服务中轻松承载任何工作流;通过在 Visual Studio 2012 中自动选择 WF/WCF 作为项目类型可实现此目的。
Microsoft BizTalk Server R2 还利用 WCF 作为通信技术。 BizTalk 设计用于接收一种标准化格式的数据,然后将其转换为另一种格式。 必须将消息传递到其中央消息框,在这里可以使用严格的映射,也可以通过使用其中一种 BizTalk 功能(如其工作流引擎)来转换消息。 目前,BizTalk 可使用 WCF 业务线 (LOB) 适配器将消息传递到消息框。
Microsoft Silverlight 是一个用于创建可互操作的、丰富 Web 应用程序的平台,允许开发人员创建媒体密集的网站(如流视频)。 从版本 2 开始,Silverlight 加入了 WCF 作为通信技术,以将 Silverlight 应用程序连接到 WCF 终结点。
Windows Server AppFabric 的承载功能 应用程序服务器是针对部署和管理使用 WCF 进行通信的应用程序专门生成的。 承载功能 包括丰富的工具和配置选项,专门设计用于启用 WCF 的应用程序。
WCF 编程模型的主要概念概述。
Windows Communication Foundation 基础概念
https://msdn.microsoft.com/zh-cn/library/ms731079(v=vs.110).aspx
本文档高度概括了 Windows Communication Foundation (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 服务作为一个终结点集合对外公开。
应用程序终结点
-
一个终结点,由应用程序公开并对应于该应用程序实现的服务协定。
基础结构终结点
-
一个终结点,由基础结构公开,以便实现与服务协定无关的服务需要或提供的功能。例如,服务可能拥有一个提供元数据信息的基础结构终结点。
地址
-
指定接收消息的位置。它以统一资源标识符 (URI) 的形式指定。URI 架构部分指定用于到达地址的传输机制,如 HTTP 和 TCP。URI 的层次结构部分包含一个唯一的位置,其格式取决于传输机制。
使用终结点地址可以为服务中的每个终结点创建唯一的终结点地址,或者在某些条件下在终结点之间共享一个地址。下面的示例演示了一个将 HTTPS 协议和一个非默认端口结合使用的地址:
HTTPS://cohowinery:8005/ServiceModelSamples/CalculatorService
绑定
-
绑定定义终结点与外界进行通信的方式。它由一组称为绑定元素的要素构造而成,这些元素“堆叠”在一起以形成通信基础结构。绑定最起码应定义传输协议(如 HTTP 或 TCP)和所使用的编码(如文本或二进制)。绑定可以包含指定详细信息(例如,用于保护消息的安全机制或终结点所使用的消息模式)的绑定元素。有关更多信息,请参见正在配置服务。
绑定元素
-
绑定元素表示绑定的特定部分,如传输协议、编码、基础结构级协议(如 WS-ReliableMessaging)的实现以及通信堆栈的其他任何要素。
行为
-
行为是控制服务、终结点、特定操作或客户端的各个运行时方面的要素。行为按照范围进行分组:常见行为在全局范围内影响所有终结点,服务行为仅影响与服务相关的方面,终结点行为仅影响与终结点相关的属性,操作级行为影响特定操作。例如,有一种服务行为是遏制,它指定当过多的消息可能超出服务的处理能力时,服务应该如何反应。另一方面,终结点行为仅控制与终结点相关的方面,如查找安全凭据的方式和位置。
系统提供的绑定
-
WCF 包含许多系统提供的绑定。这些绑定是针对特定方案进行优化的绑定元素的集合。例如,WSHttpBinding 是为了与实现各种 WS* 规范的服务进行互操作而专门设计的。通过仅提供那些可以正确应用于特定方案的选项,这些预定义的绑定可以节省时间。如果预定义的绑定不能满足您的要求,则可以创建您自己的自定义绑定。
配置与编码
-
可以通过代码编写、配置或将两者结合在一起对应用程序进行控制。配置的优点在于,它使非开发人员(如网络管理员)可以在代码编写完成后直接对客户端和服务参数进行设置,而不必重新进行编译。使用配置不仅可以设置值(如终结点地址),还可以通过添加终结点、绑定和行为来实施进一步的控制。通过代码编写,开发人员可以保持对服务或客户端的所有组件的严格控制,而且可以对通过配置完成的所有设置进行检查,并根据需要通过代码进行重写。
服务操作
-
服务操作是在服务的代码中定义的过程,用于实现某种操作的功能。此操作作为一个 WCF 客户端上的方法向客户端公开。该方法可以返回一个值,并可采用数量可选的参数,或是不采用任何参数且不返回任何响应。例如,一个实现简单的“Hello”的操作可以用作客户端存在通知,并可以开始一系列操作。
服务协定
-
服务协定将多个相关的操作联系在一起,组成单个功能单元。协定可以定义服务级设置,如服务的命名空间、对应的回调协定以及其他此类设置。在大多数情况下,协定的定义方法是用所选的编程语言创建一个接口,然后将 ServiceContractAttribute 属性应用于该接口。通过实现该接口,可生成实际的服务代码。
操作协定
-
操作协定定义参数并返回操作的类型。在创建定义服务协定的接口时,可以通过将 OperationContractAttribute 属性应用于协定中包含的每个方法定义来表示一个操作协定。可以将操作建模为采用单个消息作为参数并返回单个消息,或者建模为采用一组类型作为参数并返回一个类型。在后一种情况下,系统将确定需要为该操作交换的消息的格式。
消息协定
-
消息协定描述消息的格式。例如,它会声明消息元素应包含在消息头中还是包含在消息正文中,应该对消息的何种元素应用何种级别的安全性,等等。
错误协定
-
可以将错误协定与服务操作进行关联,以指示可能返回到调用方的错误。一个操作可以具有零个或更多个与其相关联的错误。这些错误是在编程模型中作为异常建模的 SOAP 错误。
数据协定
-
服务使用的数据类型必须在元数据中进行描述,以使其他各方可以与该服务进行交互操作。数据类型可以在消息的任何部分使用(例如,作为参数或返回类型)。如果服务仅使用简单类型,则无需显式使用数据协定。
宿主
-
服务必须承载于某个进程中。“宿主”是控制服务的生存期的应用程序。服务可以是自承载的,也可以由现有的宿主进程进行管理。
自承载服务
-
自承载服务是在开发人员创建的进程应用程序中运行的服务。开发人员控制服务的生存期、设置服务的属性、打开服务(这会将服务设置为侦听模式)以及关闭服务。
宿主进程
-
宿主进程是专为承载服务而设计的应用程序。这些宿主进程包括 Internet 信息服务 (IIS)、Windows 激活服务 (WAS) 和 Windows 服务。在这些宿主方案中,由宿主控制服务的生存期。例如,使用 IIS 可以设置包含服务程序集和配置文件的虚拟目录。在收到消息时,IIS 将启动服务并控制服务的生存期。
实例化
-
每个服务都具有一个实例化模型。有三种实例化模型:“单个”,在这种模型中,由单个 CLR 对象为所有客户端提供服务;“每个调用”,在这种模型中,将创建一个新的 CLR 对象来处理每个客户端调用;“每个会话”,在这种模型中,将创建一组 CLR 对象,并且为每个独立的会话使用一个对象。实例化模型的选择取决于应用程序要求和服务的预期使用模式。
客户端应用程序
-
客户端应用程序是与一个或多个终结点交换消息的程序。客户端应用程序通过创建一个 WCF 客户端实例并调用该 WCF 客户端的方法来开始工作。需要注意的是,单个应用程序既可以充当客户端,也可以充当服务。
通道
-
通道是绑定元素的具体实现。绑定表示配置,而通道是与该配置相关联的实现。因此,每个绑定元素都有一个相关联的通道。通道堆叠在一起以形成绑定的具体实现:通道堆栈。
WCF 客户端
-
WCF 客户端是一个将服务操作作为方法公开的客户端应用程序构造(用您所选的 .NET Framework 编程语言编写,如 Visual Basic 或 Visual C#)。任何应用程序都可以承载 WCF 客户端,包括承载服务的应用程序。因此,可以创建一个包含其他服务的 WCF 客户端的服务。
通过使用 ServiceModel 元数据实用工具 (Svcutil.exe) 并使其指向正在运行的发布元数据的服务,可以自动生成 WCF 客户端。
元数据
-
服务的元数据描述服务的各种特征,外部实体需要了解这些特征以便与该服务进行通信。 ServiceModel 元数据实用工具 (Svcutil.exe)可以使用元数据生成 WCF 客户端以及客户端应用程序可用来与服务进行交互的伴随配置。
服务所公开的元数据包括 XML 架构文档(用于定义服务的数据协定)和 WSDL 文档(用于描述服务的方法)。
启用元数据后,WCF 通过检查服务及其终结点自动生成服务的元数据。若要发布服务的元数据,必须显式启用元数据行为。
安全性
-
WCF 中的安全性包括保密性(为防止窃听而进行的消息加密)、完整性(用于检测消息篡改行为的方法)、身份验证(用于验证服务器和客户端的方法)以及授权(资源访问控制)。通过利用现有安全机制(如 TLS over HTTP,也称为 HTTPS)或通过实现各种 WS-* 安全规范中的一个或多个规范,可以提供这些功能。
传输安全模式
-
传输安全模式指定由传输层机制(如 HTTPS)提供保密性、完整性和身份验证。在使用像 HTTPS 这样的传输协议时,此模式的优点在于性能出色,而且由于它在 Internet 上非常流行,因此很容易理解。其缺点在于,这种安全分别应用于通信路径中的每个跃点,这使得通信容易遭受“中间人”攻击。
消息安全模式
-
消息安全模式指定通过实现一个或多个安全规范来保证安全,如名为“Web Services Security: SOAP Message Security”(Web 服务安全:SOAP 消息安全)的规范。每个消息都包含必要的安全机制,用于在消息传输过程中保证安全,并使接收方能够检测到篡改和对消息进行解密。从这种意义上说,安全信息包装在每个消息中,从而提供了跨多个跃点的端到端安全。由于安全信息成为消息的一部分,因此还可以在消息中包含多种凭据(这些凭据称为“声明”)。这种方法还具有这样一个优点,即消息可以通过任意传输协议(包括在其起点和目标之间的多个传输协议)安全地传送。这种方法的缺点在于所使用的加密机制较为复杂,使性能受到影响。
使用消息凭据的传输安全模式
-
此模式指定使用传输层来提供消息的保密性、身份验证和完整性,并且每个消息都可以包含消息接收方所要求的多个凭据(声明)。
WS-*
-
一组不断增加的、在 WCF 中予以实现的 Web 服务 (WS) 规范(如 WS-Security、WS-ReliableMessaging 等)的简写。
WCF 体系结构的图形化表示。
Windows Communication Foundation (WCF) 体系结构
https://msdn.microsoft.com/zh-cn/library/ms733128(v=vs.110).aspx
下图说明了 Windows Communication Foundation (WCF) 体系结构的主要层。
协定定义消息系统的各个方面。数据协定描述组成某一服务可创建或使用的每则消息的每个参数。消息参数由 XML 架构定义语言 (XSD) 文档定义,这使得任何理解 XML 的系统均可处理该文档。消息协定使用 SOAP 协议定义特定消息部分,当互操作性要求对消息的某些部分进行更精细的控制时,消息协定可实现这种控制。服务协定指定服务的实际方法签名,并以支持的编程语言之一(例如 Visual Basic 或 Visual C#)作为接口进行分发。
策略和绑定规定与某一服务进行通信所需的条件。例如,绑定必须(至少)指定所使用的传输(例如 HTTP 或 TCP)和编码。策略包括安全要求和其他条件,必须满足这些要求和条件才能与服务进行通信。
服务运行时层包含仅在服务实际运行期间发生的行为,即该服务的运行时行为。遏制控制处理的消息数,如果对服务的需求增长到预设限制,该消息数则会发生变化。错误行为指定服务出现内部错误时应采取的操作,例如控制传递给客户端的信息(信息过多会向恶意用户提供攻击的机会)。元数据行为控制是否以及如何向外部提供元数据。实例行为指定可运行的服务实例的数目(例如,singleton 指定只能用单一实例来处理所有消息)。通过事务行为,可以在失败时回滚已进行事务处理的操作。调度行为用于控制 WCF 基础结构处理消息的方式。
通过扩展性功能可以自定义运行时进程。例如,消息检查功能用于检查消息的各个部分,使用参数筛选功能可以根据作用于消息头的筛选器来执行预设操作。
消息传递层由通道组成。通道是以某种方式对消息进行处理(例如通过对消息进行身份验证)的组件。一组通道也称为“通道堆栈”。通道对消息和消息头进行操作。这与服务运行时层不同,服务运行时层主要涉及对消息正文内容的处理。
有两种类型的通道:传输通道和协议通道。
传输通道读取和写入来自网络(或外部的某些其他通信点)的消息。某些传输通道使用编码器来将消息(表示为 XML Infoset)转换为网络所使用的字节流的表示形式,或将字节流表示形式转换为消息。传输通道的示例包括 HTTP、命名管道、TCP 和 MSMQ。编码的示例包括 XML 和优化的二进制文件。
协议通道经常通过读取或写入消息的其他头的方式来实现消息处理协议。此类协议的示例包括 WS-Security 和 WS-Reliability。
消息传递层说明数据的可能格式和交换模式。WS-Security 是对在消息层启用安全性的 WS-Security 规范的实现。通过 WS-Reliable Messaging 通道可以保证消息的传递。编码器提供了大量的编码,可使用这些编码来满足消息的需要。HTTP 通道指定应使用超文本传输协议来传递消息。同理,TCP 通道指定 TCP 协议。事务流通道控制已经过事务处理的消息模式。通过命名管道通道可以进行进程间通信。使用 MSMQ 通道可以与 MSMQ 应用程序进行互操作。
服务的最终形式为程序。与其他程序类似,服务必须在可执行文件中运行。这称为“自承载”服务。
某些服务(如 IIS 或 Windows 激活服务 (WAS))“被承载”,即在外部代理管理的可执行文件中运行。通过 WAS,可以在运行 WAS 的计算机上部署 WCF 应用程序时自动激活该应用程序。还可通过可执行文件(.exe 文件)的形式来手动运行服务。服务也可作为 Windows 服务自动运行。COM+ 组件也可作为 WCF 服务承载。