Windows Workflow Foundation 功能细节

.NET Framework 4 向 Windows Workflow Foundation 添加了许多功能。 本文档介绍许多新功能,并提供有关它们可能有用的方案的详细信息。

消息传送活动

消息传递活动(Receive、、SendReplySendReceiveReply)用于从工作流发送和接收 WCF 消息。 ReceiveSendReply 活动用于构成 Windows Communication Foundation (WCF) 服务操作,该操作就像标准 WCF Web 服务一样通过 WSDL 公开。 SendReceiveReply 用于调用类似于 WCF ChannelFactory 的 Web 服务;此外,工作流基础也提供“添加服务引用”的体验,用于生成预配置的活动。

消息传递活动入门

  • 在 Visual Studio 2012 中,创建 WCF 工作流服务应用程序项目。 ReceiveSendReply 对将置于画布上。

  • 右键单击项目,然后选择 “添加服务引用”。 指向现有 Web 服务 WSDL,然后单击“ 确定”。 生成项目以显示工具箱中生成的活动(使用 SendReceiveReply实现)。

  • 工作流服务文档

消息活动示例场景

一项 BestPriceFinder 服务调用多个航空公司服务,以查找特定航线的最佳机票价格。 实施此方案需要你使用消息活动来接收价格请求、从后端服务检索价格,以及以最佳价格回复价格请求。 此外,还需使用其他现成活动来创建用于计算最优价格的业务逻辑。

WorkflowServiceHost

WorkflowServiceHost是支持多个实例、配置和 WCF 消息传送的开箱即用工作流主机(尽管工作流不需要使用消息传送才能托管)。 它还通过一组服务行为与持久性、跟踪和实例控制集成。 与 WCF 的 ServiceHost 一样,WorkflowServiceHost 可以在控制台/WinForms/WPF 应用程序、Windows 服务中自承载,也可以在 IIS 或 WAS 中以 .xamlx 文件形式进行 Web 托管。

工作流服务主机入门

WorkflowServiceHost 方案

BestPriceFinder 服务调用多个航空公司服务,以查找特定航线的最佳机票价格。 实现此方案需要你在其中 WorkflowServiceHost托管工作流。 它还将使用消息活动接收价格请求、从后端服务检索价格,以及以最佳价格回复价格请求。

关联

相关性是以下两项之一:

  • 将消息组合在一起的方式;也就是说,请求消息与其答复之间的关系。

  • 将数据片段映射到服务实例的方法

入门指南

  • 若要开始关联,请在 Visual Studio 中创建新项目。 创建类型的 CorrelationHandle变量。

  • 例如,将消息组合在一起的请求-答复相关性就是用于将消息组合在一起的相关性。

  • 将数据片段映射到服务实例的示例是基于内容的相关性,它将一段数据(例如订单 ID)映射到特定的工作流实例。

    • 在任何消息传送活动中,单击CorrelationInitializers属性,然后使用上面创建的QueryCorrelationInitializer变量添加一个CorrelationHandle。 在下拉菜单中双击消息上所需的属性(例如 OrderID)。 将 CorrelatesWith 属性设置为 CorrelationHandle 上面使用的变量。
  • 相关概念文档

相关性方案

订单处理工作流用于处理新订单的创建和正在处理的现有订单的更新。 实现此方案需要在WorkflowServiceHost托管工作流,并使用消息传递活动。 此外,还需要基于 orderId 的相关性,以确保对正确的工作流进行更新。

简化配置

WCF 配置架构很复杂,为用户提供许多难以查找的功能。 在 .NET Framework 4.6.1 中,我们专注于帮助 WCF 用户使用以下功能配置其服务:

  • 使用户不需要为每个服务进行显式配置。 如果未为服务配置任何 <服务> 元素,并且服务未以编程方式定义任何终结点,则会自动将一组终结点添加到服务,每个服务基址和服务实现的每个协定一个。

  • 使用户能够定义 WCF 绑定和行为的默认值,这些默认值将应用于没有显式配置的服务。

  • 标准终结点定义可重用的预配置终结点,这些终结点具有一个或多个终结点属性(地址、绑定和协定)的固定值,并允许定义自定义属性。

  • 最后, ConfigurationChannelFactory<TChannel> 允许你对 WCF 客户端配置进行集中管理,在应用程序域加载时间之后选择或更改配置时非常有用。

入门指南

简化的配置方案

  • 经验丰富的 ASMX 开发人员希望开始使用 WCF。 但是,WCF 似乎太复杂了! 我需要在配置文件中写入的所有信息是什么? 在 .NET 4 中,你甚至可以决定根本不具有配置文件。

  • 一组现有的 WCF 服务很难配置和维护。 配置文件包含数千行 XML 代码,这些代码非常危险。 需要帮助才能将代码量减少到更易于管理的内容。

数据协定解析程序

在 .NET Framework 3.5 中,已知类型的设计存在一些限制:

  • 无法在序列化或反序列化期间动态添加已知类型。

  • 序列化程序无法处理未知的 xsi:type 信息。

  • 用户无法指定他们想要在网络上显示的 xsi:type,例如,使网络上的序列化实例更小一些。

DataContractResolver 在 .NET Framework 4.5 中解决这些问题。

入门指南

数据协定解析程序方案

  • 无需在服务中声明数十个 KnownTypeAttribute 对象。

  • 减小 XML Blob 的大小。

流程图

流程图是一种以直观方式表示域问题的已知范例。 这是我们在 .NET Framework 4 中引入的新控制流样式。 流程图的一个核心特征是,在任何给定时间只能执行一个活动。 流程图可以表达循环和替代结果,但无法自然地表示多个节点的并发执行。

入门指南

流程图方案

流程图活动可用于实现猜测游戏。 猜测游戏非常简单:计算机选择一个随机数,玩家必须猜测该数字。 当玩家提交每个猜测时,计算机会显示提示(即“尝试较低的数字”)。 如果玩家在不到 7 次尝试中找到该数字,他们会收到来自计算机的特别祝贺。 此游戏可以通过以下过程活动的组合来实现:

过程活动(Sequence、If、ForEach、Switch、Assign、DoWhile 和 While)

过程活动提供了一种机制,用于使用程序员熟悉的概念为顺序控制流建模。 这些活动实现了传统的结构化编程语言构造,并在适当时提供与常见过程语言(如 C# 和 Visual Basic)的语言对等性。

入门指南

程序活动情境

  • Parallel:Intranet 文档管理系统具有文档审批工作流。 文档需要由多个部门的人员批准,然后才能发布到 Intranet。 审批没有既定顺序,文档处于“审批挂起”阶段时,审批可以在任何时候进行。 当用户提交文档以供审阅时,必须由其直接经理、Intranet 管理员和内部通信管理器批准。

  • ParallelForEach<T>:WF 应用程序在大型公司内管理企业采购活动。 公司规则规定,在规划任何购买作之前,需要三个不同的供应商的估值。 购买部门的员工从公司的供应商列表中选择三个供应商。 选择并通知这些供应商后,公司将等待他们的经济建议。 这些建议可以按任意顺序提出。 为了在 WF 中实现此方案,我们使用了 ParallelForEach<T>,它会循环访问供应商集合并要求他们提供经济建议。 收集所有产品/服务后,选择并显示最佳产品/服务。

InvokeMethod

活动 InvokeMethod 允许在对象或作用域中的类型中调用公共方法。 它支持调用实例和静态方法,可以带参数(包括参数数组)或不带参数,支持调用泛型方法。 它还允许同步和异步执行方法。

入门指南

  • 在 Visual Studio 2012 中,创建工作流控制台应用程序。 在工作流设计器中添加活动 InvokeMethod ,并在其中配置静态和实例方法。

  • 设计器文档:InvokeMethod 活动设计器

InvokeMethod 方案

  • 需要调用范围内的对象中的方法。 例如,需要将值添加到字典中。 调用字典实例的 Add 方法,并提供键和值。

  • 需要在旧 CLR 对象上调用方法。 如果该旧类在工作流执行期间处于范围内,可以使用 InvokeMethod,而不是创建一个自定义活动来包装对该旧类的调用。

错误处理活动

TryCatch 活动提供了一种机制,用于捕获在执行一组包含的活动期间发生的异常(类似于 C# 和 Visual Basic 中的 Try/Catch 构造)。 TryCatch 在工作流级别提供异常处理。 当抛出未经处理的异常时,程序流程将被终止,并且不会执行 Finally 块。 此行为与 C# 一致。

入门指南

错误处理方案

需要执行一组活动,在发生错误时需要执行特定的逻辑。 如果在该错误处理逻辑期间发现错误不可恢复,则会重新抛出异常,并且父活动(或主机)将解决该问题。

Pick 活动

活动 Pick 在 WF 中提供基于事件的控制流建模。 Pick 包含许多分支,其中每个分支等待特定事件在运行之前发生。 在此设置中,Pick 的行为类似于 Switch<T>,该活动将只对其执行正在侦听的一组事件中的某个事件。 每个分支都是事件驱动的,并且发生的事件首先运行相应的分支。 所有其他分支会取消并停止侦听事件。

入门指南

选择场景

需要提示用户输入。 在正常情况下,开发人员将使用类似于 ReadLine 提示用户输入的方法调用。 此设置的问题在于程序会等待用户输入内容。 在此方案中,需要超时来取消对阻止活动的阻止。 常见方案是需要在给定时间段内完成任务的情况。 在阻止活动超时的方案中,Pick 将添加大量值。

WCF 路由服务

路由服务设计为通用软件路由器,可用于控制 WCF 消息在客户端和服务之间流动的方式。 通过路由服务,你可以将客户端与服务分离,这让你在考虑如何托管服务时可以支持的配置和灵活性方面更加自由。 在 .NET Framework 3.5 中,客户端和服务紧密耦合:客户端必须知道与其通信所需的所有服务及其所在位置。 此外,.NET Framework 3.5 中的 WCF 具有以下限制:

  • 错误处理很复杂,因为此逻辑必须硬编码到客户端中。

  • 客户端和服务必须始终使用相同的绑定。

  • 服务很少受到很好的考虑:让客户端与实现一切的服务通信更容易,而无需在多个服务之间进行选择。

.NET 4 中的路由服务旨在使这些问题更易于解决。 新的路由服务具有以下功能:

  1. 基于内容的路由(MessageFilter 对象检查消息以确定应发送的位置。

  2. 协议桥接 (传输和消息)

  3. 错误处理(路由器捕获通信异常并切换到备份终结点)

  4. MessageFilterTable<TFilterData> 和路由配置的动态(内存中)更新。

入门指南

  1. 文档: 路由

  2. 示例: 路由服务 [WCF 示例]

  3. 博客: 路由规则!

路由方案

路由服务在以下方案中非常有用:

  • 客户端可以与多个服务通信,而无需直接解决这些问题。

  • 客户端可以对客户端请求执行其他逻辑以确定路由位置

  • 将客户端执行的操作分解为多个服务实现,而无需重构客户端。

  • 客户端和服务可以使用不同的安全设置来表达不同的绑定。

  • 可以使客户端更为可靠一些,从而防止出现故障或服务不可用的情况。

WCF 发现

WCF 发现是一种框架技术,可用于将发现机制合并到应用程序基础结构。 可以利用此功能提高服务的可发现性,并将客户端配置为能够搜索服务。 客户端不再需要使用终结点硬编码,从而使应用程序更可靠且容错。 发现是将自动配置功能构建到应用程序中的完美平台。

该产品基于 WS-Discovery 标准构建。 它设计为可互作、可扩展和泛型。 该产品支持两种作模式:

  1. 托管:如果网络上有一个实体对现有服务有了解,则客户端会直接查询它以获取信息。 这类似于 Active Directory。

  2. 临时:在此模式中,客户端使用多播消息来查找服务。

此外,发现消息与网络协议无关;可以在支持模式要求的任何协议上使用它们。 例如,可以通过 UDP 通道或支持多播消息传递的任何其他网络发送发现多播消息。 这些设计点结合了功能的灵活性,使您能够根据您的解决方案专门调整和适应探索过程。

入门指南

Discovery 方案

开发人员不希望硬编码终结点,因为不知道服务何时会可用。 相反,开发人员希望在运行时选择服务。 应用程序中的组件之间需要更多分离、可靠性和自动配置。

跟踪

工作流跟踪提供有关工作流实例执行的见解。 跟踪事件将在工作流中的活动执行时在工作流实例级别从工作流发出。 需要将工作流跟踪参与者添加到工作流主机以订阅跟踪记录。 使用跟踪配置文件筛选跟踪记录。 .NET Framework 提供 ETW(Windows 事件跟踪)跟踪参与者,并在 machine.config 文件中安装基本配置文件。

入门指南

  1. 在 Visual Studio 2010 中,创建 WCF 工作流服务应用程序项目。 ReceiveSendReply 对将置于画布上以开始操作。

  2. 打开 web.config 并添加一个无配置文件的 ETW 跟踪行为。

    1. 使用默认配置文件。

    2. 打开事件查看器并在以下节点中启用分析通道: 事件查看器应用程序和服务日志MicrosoftWindowsApplication Server-Applications。 右键单击“分析”,然后选择“启用日志”。

    3. 运行工作流服务。

    4. 查看事件查看器中的工作流跟踪事件。

  3. 示例: 跟踪

  4. 概念文档: 工作流跟踪和跟踪

SQL 工作流实例存储

SqlWorkflowInstanceStore这是基于 SQL Server 的实例存储实现。 实例存储将正在运行的实例的状态与加载和恢复该实例所需的所有数据一起存储。 服务主机指示实例存储区在工作流仍然存在时保存实例状态,并指示实例存储在消息到达该实例或延迟活动过期时加载实例状态。

入门指南

  1. 在 Visual Studio 2012 中,创建包含隐式或显式 Persist 活动的工作流。 将 SqlWorkflowInstanceStore 行为添加到工作流服务主机。 这可以在代码或应用程序配置文件中完成。

  2. 示例: 持久性

  3. 概念文档: SQL 工作流实例存储