使用工作流基础 4.0 构建和测试 WCF Web 服务






4.81/5 (22投票s)
有关使用工作流基础 4.0 构建和测试简单 Web 服务的指南。
目录
- 引言
- 工作流基础 4.0
- 使用 WF4.0 构建 WCF 服务
- 开始吧
- WCF Web 服务测试(使用 WCFTestClient)
引言
本文的目标是帮助开发人员熟悉工作流基础 4.0。
工作流基础 4.0
它提供了编程模型、进程内工作流引擎和可重新托管的设计器,用于在 .NET 应用程序中将长期运行的进程实现为工作流。 MSDN。
使用 WF4.0 构建 WCF 服务
本文将提供一个分步指南,用于在 WF 4.0 中构建和测试一个简单的计算器 Web 服务。我将主要使用内置的 WF 活动来构建工作流。此外,我将构建一个简单的自定义代码活动,以介绍自定义活动。
该服务将接收三个参数,两个操作数和一个操作名称,并在应用操作后将结果返回给客户端。下图说明了我们将在本次练习中实现的完整流程,最终我们的工作流将看起来像这个流程图。
构建工作流应用程序将类似于构建此流程图。以上图中的每个框都称为活动,所有活动都将包含在一个称为主活动的更大的活动中。构建此应用程序所需的大多数活动将由 Visual Studio 2010 提供,我们将添加一个新的自定义活动来将数据记录到文件中以跟踪应用程序。
开始吧
新建项目
- 启动 Visual Studio 2010
- 选择项目->新建
- 在“已安装的模板->Visual C#”下选择“WorkFlow”
- 选择“WCF 工作流服务应用程序”
- 将项目名称更改为“CalculatorWFService”
- 点击确定关闭此窗口
这将创建一个使用工作流服务模板的项目,其中包含三个内置活动:Sequence、ReceiveRequest 和 SendResponse(参见下图的设计器窗口)。
顺序活动
SequenceActivity 是一个 CompositeActivity,意味着 SequenceActivity 可以包含其他活动。SequenceActivity
类以有序的方式协调一组子活动的运行,一次一个。当最后一个子活动完成时,SequenceActivity 就完成了。
接收活动
Receive Activity 将等待客户端连接到服务,然后运行其包含的子活动。 MSDN。
发送活动
模拟服务操作同步调用的客户端活动。
重命名服务操作名称和协定名称
- 点击顺序服务到主顺序(以匹配图 1 中的工作流)。此重命名不会对应用程序产生任何影响,但会提高工作流的可读性。
- 通过右键单击文件,将 *Service1.xamlx* 文件重命名为 *CalculatorService.xamlx*。
- 默认情况下,工作流服务模板将服务配置为“
GetData
” Web 操作名称(可以将其视为 Web 方法)。要重命名此方法,请单击“ReceiveRequest”活动,并将“Operation Name”属性更改为“Calculate”。此外,将服务协定属性更改为“ICalculate”。
添加顶级变量
选择名为“Main Sequence”的活动,然后点击设计器窗口底部的“Variables”按钮。
此操作将打开一个“Variables”窗口(如下方高亮显示)。
通过选择整行删除“data”变量。一旦删除“data”变量,设计器将显示一个错误图标,表示那些不再使用“data”变量的活动。这是调试和跟踪设计时问题的非常有用的功能。
现在,我们暂时忽略这些错误图标,继续前进。完成活动配置后,它们就会消失。通过单击变量窗口中的“Create Variable”文本来添加用于保存三个输入参数的变量。创建两个类型为 int32
的参数(使用“variable type”列中的下拉控件选择变量类型),并将它们命名为“Operand1
”和“Operand2
”。创建一个类型为“string
”的第三个变量,并将其命名为“OperationName
”。此外,让我们添加一个名为“Result
”的第四个变量,类型为 string
,用于保存结果(参见下面的截图),并将其发送回调用者应用程序。
这些变量就像添加类级变量一样,可供所有类方法访问。在这种情况下,它们将可供“Main Sequence”活动中的所有活动使用。
接收活动配置
现在,我们必须配置 Receive Activity 以接受以下三个参数。要做到这一点,您需要选择 Receive Activity 并通过单击 按钮更改其“
Content
”属性。这将打开“Content Definition”窗口。点击参数单选按钮来定义参数。Message data 选项可用于接收自定义类对象。
通过单击“Add new parameters”文本来定义三个参数(如上图所示)。“parameter1
”和“parameter2
”将保存两个数字,“operationName
”将保存要对这些数字执行的操作的名称。
参数到工作流变量映射
添加参数后,我们必须将工作流级别变量分配给参数,以便所有输入数据可供所有工作流活动使用。要做到这一点,只需选择参数名称旁单元格中的“Enter a VB expression”文本,然后键入要分配给参数的变量。在本练习中,我将把 parameter1
分配给 operand1
,parameter2
分配给 operand2
,operationName
分配给 OperationName
工作流变量。
点击确定关闭窗口。
发送活动配置
要配置 Send Activity,请在设计器中选择“SendResponse”活动。通过更改其“Content
”属性来配置要发送回调用者的内容。在属性框中选择“Contents”旁边的 按钮。这将打开一个新的“Content Definition”窗口,与我们在配置 Receive Activity 时看到的相同。我们不必在此处配置参数。Message configuration 就足够了。只需将“
data.ToString()
”替换为我们在开始时声明的“Result
”变量。设计器的另一个很棒的功能是它在整个过程中提供智能感知帮助,这使得选择和查找可用变量变得更容易(参见下面的截图)。
点击确定关闭窗口,返回设计器。
现在我们已经完成了 Web 服务的输入和输出配置。下一步是根据“operationName
”参数执行某些操作。为此,我们将使用流程图活动。在开始构建流程图之前,让我们构建一个自定义代码活动,将一些跟踪信息记录到文件中,并在最终结果中添加一些文本。我们将在流程图中使用此活动。
构建自定义代码活动的步骤
- 右键单击 CalculateWFService 项目并选择 Add New Item。
- 然后,在“Installed Templates”部分,选择“workflow”。
- 选择“Code Activity”。
- 点击“Add”将此活动添加到项目中(我们将保留默认名称“codeactivity1.cs”)。
- 每个代码活动都可以拥有输入和输出参数,就像任何具有输入和输出参数的 C# 方法一样。我认为将其视为 C# 类方法及其处理输入和输出参数的方式更容易。唯一的例外是,在代码活动中,它们必须声明为
InArgument
和OutArgument
,并且必须通过当前上下文访问。在此代码活动中,我们将使用默认的InArgument
文本,并将添加一个OutArgument
“result
”。只需在类顶部键入以下内容: - 在代码活动类的
Execute
方法中添加以下简单的执行代码: - 此时构建项目以检查任何错误,并将此新代码活动添加到“Toolbox”中。
- 选择“CalculatorService.xamlx”以返回设计器。
public OutArgument<string> result { get; set; }
File.AppendAllText(@"C:\WorkflowLog.txt", "Result is:" + text);
context.SetValue(result, "Result is:" + text);
所有这些代码只是将此代码活动的输入写入文件,并在追加一些文本后返回活动的输入。此外,您还必须在文件头中添加以下内容:
using System.IO;
在代码活动中,所有活动执行逻辑都应写在 Execute
方法中。请查看以下链接以获取有关代码活动和 Execute
方法的更多信息: http://msdn.microsoft.com/en-us/library/ee264176.aspx。
流程图
还有其他选项可以获取结果,并且可以使用自定义代码活动或在 Send Activity 的配置中使用简单的表达式来完成此简单任务。但我的目标是在本次练习中尽可能多地概述工作流功能,因此我将使用流程图。
什么是流程图活动?
Flowchart Activity 是一个包含要执行的活动集合的活动。流程图还包含流程控制元素,如 FlowDecision
和 FlowSwitch
,它们根据变量的值在包含的活动之间引导执行。
流程节点类型
根据元素执行时所需的流程控制类型,可以使用不同类型的元素。流程图元素类型包括:
流程步骤
表示流程图中的一个执行步骤。
流程决策
基于布尔条件分支执行,类似于 If。
流程切换
基于独占切换分支执行,类似于 C# switch
。每个链接都有一个 Action
属性,该属性定义了一个 ActivityAction,可用于执行子活动,并且有一个或多个 Next
属性定义当前元素完成执行时要执行的一个或多个元素。您可以在 此处 了解有关流程图的更多信息。
好了,关于流程图就说到这里;让我们开始构建一个来计算结果。
步骤 1:展开 VS 工具箱中的“Flowchart”部分,然后拖动流程图活动并将其放置在“ReceiveRequest
”和 SendResponse
”活动之间(参见下图)。
步骤 2:双击流程图活动中的文本以开始绘制流程图。这将带您进入流程图设计器窗口。请注意设计器的另一个很棒的功能:设计器顶部的 面包屑导航,可用于返回顶级活动。
步骤 3:从工具箱拖动“FlowSwitch
切换活动配置
- 在设计器窗口中选择“Switch”。
- 点击属性窗口中“Expression”旁边的按钮。
- 在表达式编辑器中键入“OperationName”(智能感知将帮助您选择变量),然后单击“OK”关闭窗口。
- 现在,开关已配置为评估“
OperationName
”变量,并根据其值决定要采取的路径。因此,让我们为不同的值定义不同的路径。在本练习中,我将只执行三个计算:加法、减法和乘法,如果operationName
不是“add”、“subtract”或“multiply”,则我将返回“not implemented”消息(查看文章开头的流程图)。选择工具箱中的“CodeActivity1”,并在流程图设计器窗口中将其拖放四次。 - 从“Start”节点到“Switch”节点绘制线条,然后从“Switch”节点到每个“CodeActivity1”绘制四条线。要绘制线条,只需将鼠标指针悬停在一个活动上,然后将线条拖动到下一个活动。
- 选择除“default”线以外的所有线,并在属性窗口中将“Case”更改为“add”、“subtract”和“multiply”,如图所示:
- 选择链接到“add”情况的“CodeActivity1”,并在“
Text
”属性中键入“(Operand1 + Operand2).toString()”表达式。在“result
”属性表达式中键入“Result”。 - 选择链接到“subtract”情况的“CodeActivity1”,并在“
Text
”属性中键入“(Operand1 - Operand2).toString()”表达式。在“result
”属性表达式中键入“Result”。 - 选择链接到“multiply”情况的“CodeActivity1”,并在“
Text
”属性中键入“(Operand1 * Operand2).toString()”表达式。在“result
”属性表达式中键入“Result”。 - 选择链接到“default”情况的“CodeActivity1”,并在“
Text
”属性中键入“Not implemented”表达式。在“result
”属性表达式中键入“Result”。
如果您还记得,“Text
”是代码活动的输入参数,“result
”是输出参数。在接下来的几步中,我们将为我们添加到设计器中的所有代码活动设置这些输入和输出参数。
流程图活动将检查输入变量“OperationName
”,并采取适当的执行路径。在每个路径的末尾,我们通过“codeActivity1”将名为“Result
”的工作流级别变量设置为某个值。在流程图之后,工作流将执行发送活动,从而将“Result”值发送回调用者。
各位,就这样,我们的工作流服务准备就绪。
WCF Web 服务测试(使用 WCFTestClient)
现在,让我们使用 *WCFTESTClient.exe* 进行测试。此 exe 可以在“C:\Program Files \Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe”路径下找到。此工具可用于测试任何 WCF Web 服务。只需按照以下步骤测试我们的计算器服务:
- 右键单击项目并选择 Properties。
- 在属性页左侧点击“WEB”标签。
- 点击“Start external program”单选按钮。
- 在文本框中键入 *WCFTestClient.exe* 的路径(C:\Program Files \Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe)。
- 保存应用程序。
- 通过右键单击 Visual Studio 的解决方案资源管理器窗口中的“* .xamlx”文件并从菜单中选择“Browse”选项来获取 Web 服务引用路径。我们将需要此用于测试实用程序。
- 从浏览器复制 Web 服务链接。
- 按 F5 运行应用程序。
- 这将启动 WCFTestClient 应用程序;请参见下面的截图。
- 右键单击“My Service Project”以添加 Web 服务引用,并粘贴我们在步骤 7 中复制的服务路径。这将把 Web 服务引用添加到 WCF 测试客户端应用程序中。
- 在左侧窗口中单击 Calculate,然后在右侧窗口中展开它以查看所有输入参数。设置输入参数值并单击“Invoke”以调用 Web 服务方法。底部的“Response”窗口将显示结果。请参见下面的截图。
结论
希望本次练习让您对 Windows Workflow Foundation 有所了解。在下一篇文章中,我将尝试将其部署到 IIS,并使用 AppFabric 进行配置以进行监控。此外,我将尝试介绍一些基本且最重要的工作流功能,例如持久化、工作流执行和使用 AppFabric 进行监控。