如何:创建沙盒工作流操作

上次修改时间: 2010年7月16日

适用范围: SharePoint Server 2010

本文内容
沙盒工作流操作方案
针对沙盒工作流操作的常见使用方案
有关使用沙盒工作流操作的提示

本主题说明如何使用 SharePoint 列表对象模型创建从外部列表读取的沙盒工作流操作。

本帮助主题与沙盒工作流示例对应,后者是 Microsoft SharePoint 2010 软件开发工具包 (SDK) 的一部分。有关如何获取此示例的详细信息,请参阅代码示例:沙盒工作流示例

沙盒工作流操作是一些代码函数,可用于声明性工作流设计器并可从声明性工作流进行调用。沙盒工作流操作是在 Microsoft Visual Studio 中编写的,并会上载到 SharePoint 解决方案库。这些操作将独立运行,以确保核心系统进程受到保护并遵守边界。

通过使用沙盒工作流操作,可以一次从外部列表读取一个项,并按照某种方式存储它,以便能重用此数据。这使您能够减少对外部列表执行的读操作数,而在使用 SharePoint 工作流活动时必须执行这些操作。通过使用内置 SharePoint 工作流活动从外部列表读取列会调用 Read List 方法 (Finder) 和 Read Item 方法 (SpecificFinder),没有必要进行此调用。沙盒工作流操作可阻止不必要的调用,并减少外部系统的负载。

沙盒工作流操作方案

通常,在需要条件批准且批准条件基于外部系统中存储的值的方案中,应将工作流与 Microsoft Business Connectivity Services (BCS) 一起使用。在示例中,考虑这样一种费用批准方案,在此方案中,仅在费用总额超出安全限制时将费用报告发送给经理以供审批。如果费用金额低于或等于安全限制,则将自动批准费用,而不需要显式批准。由于费用安全限制会不断变化,因此将其存储在外部系统中,并且工作流稍后会在整个外部列表中查找它。

本主题中的示例将指导您完成创建基于 SafeLimit 外部内容类型、工作流和查找变量的外部列表的步骤。

备注

本方案假定您能熟练地对外部列表使用 SharePoint Designer 列表项活动(如果您已使用它们操作 SharePoint 列表)。列表项活动的工作方式的主要不同在于,不是通过标识符 (ID) 查找项,而是通过其标识列来查找项。

使用 SharePoint Designer 活动生成安全限制工作流

  1. 在 SharePoint Designer 中,创建一个外部内容类型,并将其命名为 SafeLimit。

    此外部内容类型应具有两个字段:EmployeeIDLimit(对于安全限制值)。

  2. 通过使用 SafeLimit 外部内容类型创建一个外部列表,并将该列表命名为 SafeLimits。

  3. 为费用报告创建一个文档库,并将该文档库命名为 ExpenseReports。然后,为 EmployeeID 添加一个列。

  4. 在 SharePoint Designer 中,在 ExpenseReports 文档库中单击"新建列表工作流"。

  5. 键入工作流名称,并提供其说明,然后单击"继续"。

    现在,您可以在工作流设计器中添加新活动。

  6. 插入"设置工作流变量"操作。

    1. 单击工作流变量超链接,然后单击"创建新的变量"。

      将此新变量命名为 SafeLimit。

    2. 单击相应的值,然后单击"fx"按钮以创建外部列表中的查找。

    3. 对于"数据源",单击"SafeLimits"外部列表。

      可从该数据源中拉出安全限制值。

    4. 对于"源中的域",选择显示安全限制的字段。在此示例中,该字段名为"Limit"。

  7. 定义用于查找项的内容。在此方案中,您需要按 Employee ID 来查找外部列表项,因此对于"字段",请单击 EmployeeID 字段。

  8. 选取要查找的值。在此方案中,您将从当前项选取 EmployeeID 字段,因此请单击对话框中的"fx"按钮。

  9. 在打开的对话框中,为"数据源"单击"当前项";为"源中的域"单击"EmployeeID"。

    图 1 显示查找对话框。

    图 1. 安全限制的查找对话框

    查找变量

  10. 单击"确定"以创建查找变量。

    在创建查找变量后,会显示一条警告,如图 2 中所示。出现此警告是因为外部列表中选择用来查找项的列不具有唯一值。在此情况下,警告会告知您查找将在找到多个值时返回第一个值。通常会遇到此与外部列表项相关的警告。

    图 2. 查找警告

    "多值查找"警告

下一个方案在上一个方案的基础上进行了扩展,它为特定的预算类别添加了安全限制,而不是为所有费用提交设置了一个安全限制。例如,您可以具有与设备费用安全限制不同的差旅费用安全限制。当员工提交费用报告时,工作流会验证类别及其费用限制以确定要执行的操作。

创建沙盒工作流操作

  1. 代码示例:沙盒工作流示例实现了本主题所描述的操作。在较高的级别上,操作应一次读取一个项,然后将该事务的其他属性读取到外部系统。我们还希望此操作出现在 Microsoft SharePoint Designer 2010 中,以便更多用户能够对列表编写工作流。由于 SharePoint Designer 不支持循环,因此此操作无法返回项的数组。相反,您可以创建一个操作以读取项并以 XML 字符串形式存储其属性。然后,我们将创建另一个操作以从该 XML 字符串中将特定字段值读入到 SharePoint Designer 变量中。可以优化此操作以仅存储要读取的值,但此示例中采用的是最常见的可重用方式返回带任何属性集的项的属性。

    带以下签名的方法从外部列表读取值。

    public static Hashtable GetExternalListItemByField(SPUserCodeWorkflowContext context, String externalListId, string fieldName, string fieldValue)
    

    此方法采用一个外部列表标识符 (ID),然后通过为名为"fieldname"的字段找到具有"fieldValue"的第一个项,在列表中查找一个项。在找到该项后,此方法将每个字段放入一个模拟运算表中,然后以 XML 形式保存每个字段,以便您能稍后进行分析。该函数是通用的,也可用于 SharePoint 列表项。这可帮助我们提高性能,因为它只会调用该查找器和特定的查找器一次,并获取所有属性;然而您仍将调用该查找器。不过,您可以优化此操作以仅调用该查找器两次,本主题稍后将对此进行探讨。

  2. 在读取项之后,调用带以下签名的方法可查找 value 参数指定的字段。

    public static Hashtable GetItemDataFromString(SPUserCodeWorkflowContext context, string itemData, string value) 
    

    此方法在 itemData 参数中采用带所有项属性的 XML 字符串,重构模拟运算表,并查找 value 参数指定的字段。这使得每次调用该函数时需要重载模拟运算表,但这样做比每次调用时转到外部系统要快得多。它还使 SharePoint Designer 用户能够选择要查看的列,而不是将其硬编码为方法。

    与此项目相关的另一个文件是位于 BCSWorkflowActivities 目录中的 elements.xml 文件。此文件告知 SharePoint Designer 沙盒操作在 SharePoint Designer 中的呈现方式以及用户如何映射属性。本主题未包含此文件的详细信息,但此文件具有与 Office SharePoint Designer 2007 中使用的 ACTIONS.xml 文件相同的基础结构。

使用 BCS 沙盒活动示例

  1. 从 Microsoft 下载中心下载 BCS 沙盒活动示例并对其进行解压缩(请参阅 SharePoint 2010 参考:软件开发工具包(该链接可能指向英文页面)。)

  2. 在 Visual Studio 2010 中打开示例。

  3. 按 F6 生成解决方案。

  4. 部署解决方案。

    如果将解决方案部署到另一台计算机,则可使用步骤 3 中创建的解决方案包(.wsp 文件),并执行以下操作:

    1. 在"网站设置"中的"库"下,选择"解决方案"。

    2. 上载 .wsp 文件并将其激活。

创建工作流

  1. 在 SharePoint Designer 中,创建一个外部内容类型,并将其命名为 SafeLimit。

    外部内容类型应具有以下七个字段:EmployeeIDEquipmentLimitEquipmentApproverMoraleLimitMoralApproverTravelLimitTravelApprover

  2. 为 SafeLimit 外部内容类型创建外部列表,并将其命名为 SafeLimits。

  3. 为费用报告创建一个文档库,并将该文档库命名为 ExpenseReports。

  4. 分别为 EmployeeIDExpenseType 添加一个列。

    ExpenseType 应是具有以下选项的选项字段:MoraleEquipmentTravel

  5. 在 SharePoint Designer 中,在 ExpenseReports 文档库中单击"新建列表工作流"。

  6. 键入工作流名称和说明,然后单击"继续"。

    此时,已进入工作流设计器,并可添加新操作。

  7. 插入"按字段获取外部列表项(沙盒函数)"。

    1. 为第一个参数选取 SafeLimits 外部列表。

    2. 通过使用"fx"按钮为第二个参数选取使用 CurrentItemEmployeeID 列。

    3. 为第三个参数键入 EmployeeID。

    4. 可以将输出参数保持不变(其默认为 ItemString)。

  8. 若要从 ItemString 中存储的项读取数据列,请插入"读取外部列表项数据(沙盒解决方案)"。

    1. 对于第一个参数,键入希望看到的字段。在此方案中,使用选项字段 ExpenseType 中存储的值,并为该值追加 Limit。

    2. 对于第二个参数,选择 ItemString 变量。

    3. 最后一个参数是找到的值;将其命名为 limit。

  9. 重复步骤 8 并将 Approver 追加到 ExpenseType 值(而不是 Limit),然后更改发送给审批者的输出。

    图 1 显示现在应具有的工作流。

    图 1. 沙盒工作流

    沙箱工作流

针对沙盒工作流操作的常见使用方案

如果您无权部署完全信任活动并希望执行以下任一操作,则对外部列表使用沙盒工作流操作:

  • 从外部列表读取多个值。

  • 编写将用于 SharePoint 列表和外部列表的简单函数。

有关使用沙盒工作流操作的提示

如果沙盒工作流操作无法获取沙盒工作进程应用程序域,则会导致工作流失败。管理员配置的应用程序域的数目是固定的,并且应用程序域可与所有沙盒代码(如操作、Web 部件和事件接收器)一起共享。为此,在以下情况下使用沙盒操作时务必小心:

  • 需要消耗大量时间才能完成的复杂沙盒代码操作。

  • 处理速度慢的外部列表。

  • 多个工作流将同时运行的环境。

  • 无法处理工作流失败的方案。

由于沙盒代码服务可使用应用程序池帐户之外的其他帐户运行这些调用,您必须确保在Secure Store Service中建立了此帐户。

如果存储已从外部列表项读取的数据的本地副本(如该示例中所示),则需要确保数据是最新的。