状态机工作流服务示例

本示例演示如何使用状态机工作流创建工作流服务以及如何使用状态机工作流实现计算器,并演示能够自动保存状态的长时间运行进程。您重新启动工作流服务时,客户端可以与工作流服务的同一个实例通信,这是因为保留了工作流的状态。本示例还演示如何实施协定中的应用程序级协议,以便在意外地对服务调用操作时工作流能够引发异常。

提示

此示例需要安装 .NET Framework 3.5 版才能生成和运行。若要打开项目和解决方案文件,需要使用 Visual Studio 2008。

有关 设置此示例的更多信息,请参见 One-time Setup Procedure for Windows Communication Foundation Samples

此服务实现下面示例代码中显示的 ICalculator 服务协定。

[ServiceContract(Namespace = "http://Microsoft.WorkflowServices.Samples")]
public interface ICalculator
{
    [OperationContract()]
    int PowerOn();
    [OperationContract()]
    int Add(int value);
    [OperationContract()]
    int Subtract(int value);
    [OperationContract()]
    int Multiply(int value);
    [OperationContract()]
    int Divide(int value);
    [OperationContract()]
    void PowerOff();
}

此示例实现一组状态,每个状态有一组事件处理程序。每个事件处理程序包含在 ICalculator 协定上实现操作的 Receive 活动。由于处于给定状态中,因此状态机工作流可以接受 Receive 活动在该状态中实现的一组操作。这有助于实施应用程序级协议。

Web.config 文件定义服务的绑定并公开两个具有不同绑定的终结点:启用了 Cookie 的 BasicHttpContextBinding 和适用于不希望使用 BasicHttpContextBinding 的客户端的 WSHttpContextBindingWSHttpContextBinding 帮助维护用于将请求路由到特定工作流实例的上下文。

在 Internet 信息服务 (IIS) 中设置服务

  1. 执行在 One-time Setup Procedure for Windows Communication Foundation Samples中列出的设置说明。

  2. 在 IIS 中,对 ServiceModelSamples 虚拟目录启用 Windows 身份验证。

    在 IIS 5.1 或 6.0 中启用 Windows 身份验证:

    1. 打开一个命令提示符窗口,并键入**“start inetmgr”** 以打开 Internet 信息服务 (IIS) MMC 管理单元。
    2. 右击**“默认网站”内的虚拟根目录“ServiceModelSamples”,单击“属性”,然后单击“目录安全性”**选项卡。
    3. 在**“身份验证和访问控制”之下,单击“编辑”**。
    4. 在**“身份验证方法”对话框中,选择“集成 Windows 身份验证”**。

    在 IIS 7.0 中启用 Windows 身份验证:

    1. 打开一个命令提示符窗口,并键入**“start inetmgr”** 以打开 Internet 信息服务 (IIS) MMC 管理单元。
    2. 选择**“默认网站”内的“ServiceModelSamples”**虚拟根目录。
    3. 在**“ServiceModelSamples”主窗格内,双击“IIS”组内的“身份验证”**。
    4. 选择**“Windows 身份验证”并选择“启用”**操作。
  3. 生成项目。此项目将生成并更新 ServiceModelSamples。

  4. 允许访问持久存储:

    1. 运行位于 One-Time Setup Procedure for the Windows Communication Foundation Samples主题中的 CreateStores.cmd 脚本。本示例使用 NetFx35Samples_ServiceWorkflowStore 数据库。
    2. 确保 ASP.NET 用户帐户是 SQL Server 用户组的成员。
  5. 若要确保正确安装服务,请将浏览器指向地址 https://localhost/ServiceModelSamples/service.svc。您应当会看到服务的帮助页。若要查看 Web 服务描述语言 (WSDL),请键入 https://localhost/ServiceModelSamples/service.svc?wsdl。

  6. 若要运行此示例,必须使用计算器客户端示例。这是一个使用 Windows Presentation Foundation (WPF)(可作为服务的客户端)创建的计算器用户界面。您可以使用与该服务提供的绑定相对应的不同终结点。若要更改绑定,请单击**“终结点”**菜单项并选择适当的绑定:BasicHtttpContextBindingWSHttpContextBinding

  7. 若要测试服务的持久性,请在计算器客户端正在运行时关闭并重新打开客户端。计算器客户端会重新与同一个服务实例进行通信,并在底部显示实例 ID。在进行第一次调用时,计算器客户端使用名为 Client.ctx 的文本文件将上下文存储在一个永久位置(在本例中,为示例的 \bin 目录)。重新打开客户端时,此客户端将检查文件是否存在。如果此文本文件存在,客户端将把存储的上下文应用于正在创建的通道。如果工作流服务已经完成并且您打开了此客户端,而 Client.ctx 文件仍在您的 \bin 目录中,则它将尝试对通道应用上下文。您将收到错误,因为不存在要与其进行通信的工作流实例。请删除文件并重试。

  8. 还可以通过重新启动 IIS 回收工作流服务。因为在每次操作之后都要使用持久性存储区,所以服务的状态为“已存储”。因此,当您尝试在重新启动 IIS 后从客户端与该服务进行通信时,工作流基础结构将从持久性存储区中收到工作流实例,而您可以与同一个实例进行通信。

    提示

    在重新启动 IIS 之后首次调用一个操作时,您将收到 MessageSecurityException 异常,这是由通道上过期的安全令牌引起的。如果调用另一项操作,则此操作将会成功。

向 Microsoft 发送对本主题的评论。