Windows Workflow Foundation 功能详细信息
.NET Framework 4 向 Windows Workflow Foundation 添加了大量功能。 本文档介绍了大量新的功能,并详述了这些功能可用于的方案。
消息传递活动
消息传递活动(Receive、SendReply、Send、ReceiveReply)用于发送和接收来自工作流的 WCF 消息。 Receive 和 SendReply 活动用于构成 Windows Communication Foundation (WCF) 服务操作,该操作就像标准 WCF Web 服务一样通过 WSDL 公开。 Send 和 ReceiveReply 用于使用类似于 WCF ChannelFactory 的 Web 服务;对于生成预配置活动的 Workflow Foundation,还提供“添加服务引用”体验。
消息传递活动入门
在 Visual Studio 2012 中,创建一个 WCF 工作流服务应用程序项目。 Receive 和 SendReply 对将置于画布上。
右键单击该项目并选择“添加服务引用”。 指向现有的 Web 服务 WSDL,然后单击“确定”。 生成项目,以在工具箱中显示生成的活动(使用 Send 和 ReceiveReply 实现)。
消息传递活动示例方案
BestPriceFinder
服务调用多个航空公司服务来查找特定航线的最佳票价。 若要实现此方案,需使用消息活动来接收价格请求,从后端服务中检索价格,并以最优价格回复价格请求。 此外,还需使用其他现成活动来创建用于计算最优价格的业务逻辑。
WorkflowServiceHost
WorkflowServiceHost 是现成的工作流主机,可支持多个实例、配置和 WCF 消息传递(虽然工作流无需使用消息传递即可进行承载)。 它还通过一组服务行为集成了持久性、跟踪和实例控件。 与 WCF 的 ServiceHost 一样,WorkflowServiceHost 可以在控制台/WinForms/WPF 应用程序或 Windows 服务中自承载,也可以在 IIS 或 WAS 中通过 Web 承载(作为 .xamlx 文件)。
工作流服务主机入门
在 Visual Studio 2010 中,创建一个 WCF 工作流服务应用程序项目:此项目将设置为在 Web 承载环境中使用 WorkflowServiceHost。
若要承载非消息传递工作流,请添加一个自定义 WorkflowHostingEndpoint,它将创建基于消息的实例。
可通过将 WorkflowControlEndpoint 添加到 WorkflowServiceHost,然后使用 WorkflowControlClient 来控制工作流实例(例如,已挂起或已终止)。
WorkflowServiceHost 的示例可在以下部分找到:
WorkflowServiceHost 方案
BestPriceFinder 服务调用多个航空公司服务来查找特定航线的最佳票价。 实现此方案需要你在 WorkflowServiceHost 中承载工作流。 它还将使用消息活动来接收价格请求,从后端服务中检索价格,并以最优价格回复价格请求。
关联
相关性具有以下两种含义:
将消息组合在一起的方法;即,请求消息与其答复之间的关系。
将一段数据映射到一个服务实例的方法
入门
若要开始学习相关性,请在 Visual Studio 中创建一个新项目。 创建一个类型为 CorrelationHandle 的变量。
例如,将消息组合在一起的请求-答复相关性就是用于将消息组合在一起的相关性。
在 Receive 活动上单击 CorrelationInitializers 属性,并使用上面第一个步骤中创建的 CorrelationHandle 添加 RequestReplyCorrelationInitializer。
通过右键单击 Receive 并单击“创建 SendReply”来创建 SendReply 活动。 将其粘贴到工作流中的 Receive 活动后。
将一段数据映射到一个服务实例的示例为基于内容的相关性,它将一段数据(例如,订单 ID)映射到一个特定的工作流实例。
- 在任何消息传递活动上,单击
CorrelationInitializers
属性,并使用上面创建的 QueryCorrelationInitializer 变量添加 CorrelationHandle。 从下拉菜单中,双击消息上的所需属性(如 OrderID)。 将CorrelatesWith
属性设置为上面使用的 CorrelationHandle 变量。
- 在任何消息传递活动上,单击
相关性方案
订单处理工作流用于处理新订单的创建和更新正在进行的现有订单。 若要实现此方案,需在 WorkflowServiceHost 中承载工作流并使用消息传递活动。 此外,还需要基于 orderId
的相关性,以确保对正确的工作流进行更新。
简化配置
WCF 配置架构比较复杂,导致用户难以查找功能。 在 .NET Framework 4.6.1 中,我们致力于帮助 WCF 用户使用以下功能来配置其服务:
使用户不需要为每个服务进行显式配置。 如果没有为服务配置任何 <service> 元素,并且服务未以编程方式定义任何终结点,则会向服务自动添加一组终结点,每个服务基址和服务实现的每个协定各对应一个终结点。
使用户能够为 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 中引入的新控制流样式。 流程图的核心特点是,在任何给定时间只能执行一个活动。 流程图可以表示循环和备选结果,但无法表示多个节点的并发执行。
入门
在 Visual Studio 2012 中,创建一个工作流控制台应用程序。 在工作流设计器中添加流程图。
流程图功能使用以下类:
示例:
设计器文档:
流程图方案
流程图活动可用于实现猜谜游戏。 猜谜游戏非常简单:计算机选择一个随机数,然后玩家必须猜出该数字。 当玩家提交所猜的每个数字时,计算机会给出一个提示(即“尝试更小的数”)。 如果玩家在 7 次之内猜出该数字,计算机会向其显示特定的祝贺语。 可使用以下过程活动组合来实现此游戏:
过程活动(Sequence、If、ForEach、Switch、Assign、DoWhile 和 While)
过程活动提供了一种机制,该机制使用程序员熟悉的概念为顺序控制流建模。 这些活动会启用传统结构化编程语言构造,并在适当时提供采用公共过程语言(如 C# 和 Visual Basic)的语言奇偶校验。
入门
在 Visual Studio 2012 中,创建一个工作流控制台应用程序。 在工作流设计器中添加过程活动。
示例:
设计器文档:
过程活动方案
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>,该活动将只对其执行正在侦听的一组事件中的某个事件。 每个分支都是事件驱动的,并且发生的事件将先运行对应的分支。 所有其他分支会取消并停止侦听事件。
入门
在 Visual Studio 2012 中,创建一个工作流控制台应用程序。 在工作流设计器中添加 Pick 活动。
示例:使用 Pick 活动
设计器文档:Pick 活动设计器
Pick 方案
系统需要提示用户进行输入。 在正常情况下,开发人员将使用诸如 ReadLine 之类的方法调用来提示用户进行输入。 此设置的问题是,程序会一直等到用户输入后才运行。 在此方案中,需要超时来取消对阻止活动的阻止。 常见的方案会要求在给定持续时间内完成任务。 在阻止活动超时的方案中,Pick 将添加大量值。
WCF 路由服务
路由服务被设计成一个通用的软件路由器,用于控制 WCF 消息在客户端和服务之间的流动方式。 你可以使用路由服务将客户端与服务分离,从而在可以支持的配置和考虑如何承载服务时的灵活性方面拥有更大的自由。 在 .NET Framework 3.5 中,客户端和服务是紧密耦合的;客户端必须知道它需要与之对话的所有服务及其所在的位置。 此外,NET Framework 3.5 中的 WCF 具有以下限制:
错误处理较为复杂,因为必须将此逻辑硬编码到客户端中。
客户端和服务必须始终使用同一绑定。
服务很少能适当地分解:让客户端与一个能实现所有操作的服务进行通信而不必在多个服务之间选择,这样的做法更简单一些。
.NET 4 中的路由服务旨在更轻松地解决这些问题。 新的路由服务具有以下功能:
基于内容的路由(MessageFilter 对象会检查消息以确定其发送位置。)
协议桥接(传输和消息)
错误处理(路由器将捕获通信异常并将故障转移到备份终结点)
MessageFilterTable<TFilterData> 和路由配置的动态(内存中)更新。
入门
路由方案
路由服务在以下方案中很有用:
客户端可与多个服务通信,而无需直接处理所有这些服务。
客户端可对客户端请求执行其他逻辑以确定其路由位置
将客户端执行的操作分解为多个服务实现而不重构客户端。
客户端和服务可与具有不同安全设置的不同绑定进行通信。
可以使客户端更为可靠一些,从而防止出现故障或服务不可用的情况。
WCF Discovery
WCF Discovery 是一种框架技术,允许你将发现机制并入应用程序基础结构中。 利用此技术,您可以使服务可发现,并配置客户端以搜索服务。 不再需要使用终结点对客户端进行硬编码,即可使应用程序的可靠性更高,容错能力更强。 Discovery 是一个用于将自动配置功能构建到应用程序中的最佳平台。
该产品是基于 WS-Discovery 标准构建的。 它设计为具有互操作性、可扩展性和通用性。 该产品支持两种操作模式:
托管:在此模式中,网络上有一个了解现有服务的实体,客户端可直接从该实体查询信息。 这与 Active Directory 类似。
临时:在此模式中,客户端使用多播消息来查找服务。
此外,发现消息是网络协议不可知的;可以对支持该模式需求的任何协议使用它们。 例如,可以通过 UDP 通道或支持多播消息传递的任何其他网络发送发现多播消息。 这些设计点融入了功能灵活性,允许你根据自己的解决方案量身定制发现机制。
入门
Discovery 方案
开发人员不希望对终结点进行硬编码,因为我的服务的可用时间未知。 相反,开发人员希望在运行时选择服务。 应用程序的各个组件之间需要更大程度的分离、稳定性和自动配置。
跟踪
工作流跟踪有助于深入了解工作流实例的执行情况。 跟踪事件将在工作流中的活动执行时在工作流实例级别从工作流发出。 需要将工作流跟踪参与者添加到工作流主机中以订阅跟踪记录。 使用跟踪配置文件筛选跟踪记录。 .NET Framework 提供了 ETW(Windows 事件跟踪)跟踪参与者,并在 machine.config 文件中安装了基本配置文件。
入门
在 Visual Studio 2010 中,创建 WCF 工作流服务应用程序项目。 Receive 和 SendReply 对将置于画布上以开始操作。
打开 web.config 并添加一个无配置文件的 ETW 跟踪行为。
使用默认配置文件。
打开事件查看器并启用以下节点中的分析通道:“事件查看器”、“应用程序和服务日志”、“Microsoft”、“Windows”和“应用程序服务器-应用程序”。 右键单击“分析”,然后选择“启用日志”。
运行工作流服务。
在事件查看器中观察工作流跟踪事件。
示例:跟踪
概念文档:工作流跟踪
SQL 工作流实例存储
SqlWorkflowInstanceStore 是实例存储的基于 SQL Server 的实现。 实例存储将存储正在运行的实例的状态以及加载和恢复该实例所需的所有数据。 服务主机将在工作流仍存在时指示实例存储保存实例状态,并在该实例的消息到达或延迟活动过期时指示实例存储加载实例状态。
入门
在 Visual Studio 2012 中,创建一个包含隐式或显式 Persist 活动的工作流。 将 SqlWorkflowInstanceStore 行为添加到工作流服务主机。 这可以在代码或应用程序配置文件中完成。
示例:持久性
概念文档:SQL 工作流实例存储区。