如何:在沙盒解决方案中创建和部署工作流操作

本主题介绍如何在沙盒解决方案中创建和部署自定义工作流操作。

上次修改时间: 2011年4月13日

适用范围: SharePoint Foundation 2010

在 SharePoint Online 中提供

部署自定义操作后,可将其用于声明性工作流设计器(例如 Microsoft SharePoint Designer)。

提示提示

有关其他示例,请参阅How to: Create a Sandboxed Workflow Action

如果您希望网站集用户能够在 SharePoint Designer 中使用自定义工作流操作,但您无权安装服务器场解决方案,则可以将此操作安装在沙盒解决方案中。此过程与您在服务器场解决方案中创建和安装自定义工作流操作的方式之间存在以下区别:

  • 您必须创建由工作流引擎调用并在沙盒工作进程中运行的自定义类和方法。此方法将构成自定义工作流操作的工作流活动。

  • 定义 SharePoint Designer 的工作流操作的声明性标记在功能清单文件中部署到内容数据库,而不是在 .actions 文件中部署到前端 Web 服务器的文件系统,并且功能清单文件中使用的 WorkflowActions 标记与 .actions 文件中使用的 WorkflowInfo 标记稍有不同。

创建活动方法

  1. 启动一个 Microsoft Visual Studio SharePoint 项目。它可以是沙盒解决方案中允许的任何项目类型,包括"空白 SharePoint 解决方案"。(它不能是"业务数据连接模型"、"网站模板"、"可视 Web 部件"、"顺序工作流"或"状态机工作流"。)

  2. 在"解决方案资源管理器"中,双击 .feature 文件以打开"功能设计器"。

  3. 在"功能设计器"中,将"范围"设置为"网站"。

  4. 向项目中添加"类"项。

  5. 为该类和命名空间提供适当名称,并为 System.CollectionsMicrosoft.SharePointMicrosoft.SharePoint.UserCode 添加 using 语句。

  6. 在该类中声明一个将包含自定义工作流活动的逻辑的方法。此方法必须满足以下条件:

    • 它必须是 public。

    • 它必须是 static。

    • 它必须返回 Hashtable 对象。

    • 它必须采用 SPUserCodeWorkflowContext 对象作为其第一个参数。(它可以根据需要具有其他参数。)

    下面是您此时应具有的方法的示例。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using System.Collections;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.UserCode;
    
    namespace Contoso.SharePoint.Workflow.Actions
    {
        class ListCreation
        {
            public static Hashtable CreateList(SPUserCodeWorkflowContext context, String listTitle, String listDescription, String listType)
            {
    
            }
        }
    }
    
  7. 在此方法中指定活动的逻辑。

    重要注释重要信息

    此方法将在沙盒工作进程中运行,因此它必须遵循在该进程中可以执行的操作的限制。例如,代码无法访问当前网站集之外的任何内容,也无法读取或写入服务器的文件系统。有关详细信息,请参阅沙盒解决方案的限制

    下面继续上一个示例。

    public static Hashtable CreateList(SPUserCodeWorkflowContext context, String listTitle, String listDescription, String listType)
    {
        using (SPSite siteCollection = new SPSite(context.SiteUrl))
        {
            SPWeb currentWeb = siteCollection.OpenWeb(context.WebUrl);  
            SPListTemplateCollection availableListTypes = currentWeb.ListTemplates;
            SPListTemplate listTemplate = availableListTypes[listType];
            Guid listID = currentWeb.Lists.Add(listTitle, listDescription, listTemplate);
            Hashtable result = new Hashtable();
            result["ListID"] = listID.ToString();
            return result;
        }
    }
    

创建 WorkflowActions 标记

  1. 在此项目中,从 Visual Studio 中的"SharePoint 2010"模板添加"空元素"项。

  2. 在"解决方案资源管理器"中,打开 Elements.xml 文件。

  3. 将 WorkflowActions 元素添加为 Elements 元素的子级。

  4. Action 子元素添加到 WorkflowActions 元素中并设置其属性。下面是一个示例。

    <Action Name="Create a List" 
            SandboxedFunction="true" 
            Assembly="$SharePoint.Project.AssemblyFullName$" 
            ClassName="Contoso.SharePoint.Workflow.Actions.ListCreation" 
            FunctionName="CreateList" 
            AppliesTo="all" 
            UsesCurrentItem="true"
            Category="Contoso Actions">
    </ Action>
    
  5. RuleDesigner 子级添加到 Actions 元素中并指定其 Sentence 属性。

    <RuleDesigner Sentence="Create a %1 list named %2, and described as %3">
    
    </RuleDesigner>
    
  6. 对于 Sentence 中的每个变量字段,添加 FieldBind 子元素并配置其属性。

    <RuleDesigner Sentence="Create a %1 list named %2, and described as %3">
      <FieldBind Id="1" Field="listType" DesignerType="Text" Text="list type"/>
      <FieldBind Id="2" Field="listTitle" DesignerType="Text" Text="list name"/>
      <FieldBind Id="3" Field="listDescription" DesignerType="Text" Text="description"/>
    </RuleDesigner>
    

    备注

    虽然上一个 RuleDesigner 示例没有使用活动方法返回的 Hashtable,但可以在规则中使用返回值。如果您使用返回值,则 RuleDesigner 元素中必须有此值的 FieldBind 元素。例如,您可以将"Result: %4"添加到 Action 元素的 Sentence 属性中,然后添加附加的 FieldBind 元素,如下所示:<FieldBind Id="4" Field="result" DesignerType="Text" Text="ID of new list"/>。

    警告注释警告

    不要为 Sentence 中没有引用的任何参数添加 FieldBind 元素。这样做不会阻止部署工作流操作,但用户会在尝试使用工作流中的操作时收到无法修复的错误。

  7. 因为工作流引擎将调用您的自定义活动方法而非您自己的代码,所以您必须告诉它方法的参数。将 Parameters 元素 (WorkflowActions) 添加到 Action 元素中。

  8. 定义的第一个参数始终是必需的 SPUserCodeWorkflowContext 参数,并且它的标记始终相同。以下示例中显示了该参数。

    <Parameters>
      <Parameter Name="__Context" Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext, Microsoft.SharePoint.WorkflowActions" Direction="In" DesignerType="Hide" />
    </Parameters>
    

    请注意,类型标识为 Microsoft.SharePoint.WorkflowActions.WorkflowContext,而非 Microsoft.SharePoint.UserCode.SPUserCodeWorkflowContext。这是因为工作流引擎通过 WorkflowContext 对象中的属性值生成 SPUserCodeWorkflowContext 对象。

  9. 为您添加到 RuleDesigner 元素中的每个 FieldBind 元素添加另一个 Parameter 元素。Parameter 元素的 Name 属性必须与相应的 FieldBind 元素的 Field 属性的值相匹配。下面继续当前示例。

    <Parameters>
      <Parameter Name="__Context" Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext, Microsoft.SharePoint.WorkflowActions" Direction="In" DesignerType="Hide" />
      <Parameter Name="listType" Type="System.String, mscorlib" Direction="In" DesignerType="TextBox"/>
      <Parameter Name="listTitle" Type="System.String, mscorlib" Direction="In" DesignerType="TextBox" />
      <Parameter Name="listDescription" Type="System.String, mscorlib" Direction="In" DesignerType="TextBox" />
    </Parameters>
    

    备注

    如果您具有返回值的 FieldBind 元素,则还必须具有它的 Parameter 元素。Parameter 的 Direction 属性的值为"Out";例如,<Parameter Name="result" Type="System.String, mscorlib" Direction="Out" DesignerType="ParameterNames" />

  10. 生成并打包解决方案并使 SharePoint 解决方案包(.wsp 文件)可供网站集管理员使用。

将工作流操作部署到网站集

  • 沙盒解决方案由网站集管理员安装和部署,网站集管理员会将该解决方案安装到网站集的解决方案库中。此过程包括两个步骤。

    1. 网站集管理员将解决方案包上载到库中。

    2. 网站集管理员部署此包,此过程对沙盒解决方案而言称为"激活"。此步骤自动激活包中的所有功能。如果向网站集注册了任何解决方案验证程序,则还会在激活(部署)阶段执行这些验证程序。

    如果解决方案通过验证并且未被服务器场管理员阻止,则可随时在网站集中使用它。

测试工作流操作

  1. 打开在其上激活了您的解决方案中的功能的网站。

  2. 在"网站操作"菜单上,选择"在 SharePoint Designer 中编辑"。

  3. 创建使用新工作流操作的工作流并测试它。下面的步骤测试当前示例中的工作流操作。

    1. 在 SharePoint Designer 中打开网站(包含"通知"列表)后,单击导航窗格中的"工作流"。

    2. 在功能区上,单击"列表工作流",并在下拉列表中选择"通知"。

    3. 在"创建列表工作流"对话框中的"名称"框中,键入 Return From Trade Show,然后单击"确定"。

    4. 在工作流设计图面中,单击功能区上的"条件",然后在下拉列表中选择"如果当前项目域等于值"。步骤 1 中将显示条件"如果域等于值"。

    5. 单击"域"链接,然后在下拉列表中选择"标题"。

    6. 单击"等于"链接,然后在下拉列表中选择"结尾是"。

    7. 单击"值"链接,然后在打开的文本框中键入 trade show。按 Enter。

    8. 单击条件下的"开始键入"区域以使焦点位于其中。

    9. 在功能区上,单击"操作"。您会在下拉列表中看到您的新类别"Contoso Actions"并在列表中看到新操作"Create a list"。

    10. 选择"Create a list"。将显示您在 Action 元素中定义的"sentence"。

    11. 单击"列表类型"链接,然后在打开的文本框中键入 Contacts。按 Enter。

    12. 单击"列表名称"链接,然后单击省略号按钮(...)来打开"字符串生成器"对话框。

    13. 在文本框中键入 Contacts met at (末尾有一个空格)。

    14. 单击"添加或更改查找"按钮。这会打开"查找字符串"对话框。

    15. 在"数据源"下拉列表中,选择"当前项"。

    16. 在"源中的域"下拉列表中,选择"标题"。

    17. 单击"确定"关闭对话框,然后再次单击"确定"来关闭"字符串生成器"对话框。

    18. 单击"说明"链接,然后单击省略号按钮(...)来打开"字符串生成器"对话框。

    19. 在文本框中键入 These are contacts we made at the (末尾有一个空格)。

    20. 单击"添加或更改查找"按钮。这会打开"查找字符串"对话框。

    21. 在"数据源"下拉列表中,选择"当前项"。

    22. 在"源中的域"下拉列表中,选择"标题"。

    23. 单击"确定"关闭对话框,然后再次单击"确定"来关闭"字符串生成器"对话框。

      您的操作现在应指示创建名为 Contacts met at [%当前项:标题%] 并描述为 These are contacts we met at [%当前项:标题%] 的 Contacts 列表

    24. 在功能区上,单击"检查错误",然后修复报告的任何错误。

    25. 在功能区上,单击"工作流设置"。

    26. 在"启动选项"区域,启用"创建项目时自动启动工作流"。

    27. 在功能区上,单击"保存"。

    28. 在功能区上,单击"发布"。

    29. 关闭 SharePoint Designer。

    30. 在浏览器中,打开您将工作流发布到的网站,然后导航到"通知"列表。

    31. 单击"添加新通知"。

    32. 对于"标题",键入 Berlin trade show,然后单击"保存"。

    33. 刷新"通知"列表页。名为"Return from Trade Show"的新列将显示在列表中,并且新项的值为"进行中"或"已完成"。

    34. 一直刷新该页,直到"Return from Trade Show"工作流指示"已完成"。

    35. 单击导航窗格中的"列表"或"所有网站内容"。将有一个名为"Contacts met at Berlin trade show"、说明为"These are contacts we made at the Berlin trade show"的新列表。

请参阅

概念

可以在沙盒解决方案中实现哪些内容

沙盒解决方案的限制

沙盒解决方案体系结构