SharePoint 开发

为 SharePoint Online 构建工作流解决方案

Chris Mayo

下载代码示例

许多组织都采用了 SharePoint,以此促进组织内信息工作者之间的协作。这些组织常常使用 SharePoint 将信息存储在列表中以及文档库中,以支持人工业务流程。将这些信息存储在 SharePoint 中确实可以更方便、更高效地这些围绕信息进行协作,不过,如果在 SharePoint 中以 SharePoint 工作流的形式自动执行这些业务流程将会大大提高信息工作者的工作效率。

随着 Office 365 的发布,SharePoint Online 为组织提供许多原来可由 SharePoint 提供的协作优势,同时具备基于云的软件即服务优势。SharePoint Online 通过声明性工作流支持工作流,声明性工作流是在 SharePoint Designer 2010 中构建并通过沙盒解决方案部署的。如果内置的工作流操作不能满足工作流解决方案的要求,可使用 Visual Studio 2010 构建自定义工作流操作,然后通过沙盒解决方案部署到 SharePoint Online。

本文将概述 SharePoint Online 中的工作流支持,使用 SharePoint Designer 2010 构建一个声明性工作流,通过自定义操作扩展该工作流,然后在 SharePoint Online 中将该工作流作为沙盒解决方案部署到云中运行。

有关 SharePoint Online 开发与 SharePoint 2010 开发之间的异同的信息,请参阅我 2011 年 3 月在 MSDN 杂志 (bit.ly/spodevmsdn) 中发表的文章“通过 SharePoint Online 实现基于云的协作”。有关 SharePoint Online 和 Office 365 的详细信息(包括如何注册试用帐户),请访问 office365.com

SharePoint Online 开发概述

通过 SharePoint Online,您可以使用 SharePoint 2010 开发所使用的技术和工具(包括 Visual Studio 2010、SharePoint Designer 2010、C# 或 Visual Basic,以及 SharePoint API 和 SDK)来创建协作解决方案。尽管 SharePoint 2010 解决方案开发和 SharePoint Online 解决方案开发有许多相似之处,这两者还是有一些区别,这些区别会影响能够构建哪些解决方案以及如何构建这些解决方案。

SharePoint Online 仅支持沙盒解决方案,这意味着无法部署基于代码的工作流,包括使用顺序工作流和状态机工作流项目项构建的解决方案。不过,使用 SharePoint Designer 2010 构建的工作流是受支持的,因为这些工作流是声明性工作流而不是基于代码的工作流,可直接部署到 SharePoint Online,也可以使用程序包文件通过解决方案库进行部署。此外,还可以通过 Visual Studio 2010 构建的沙盒解决方案扩展这些声明性工作流,从而提供自定义工作流操作来支持 SharePoint Designer 2010 原本不支持的方案。

本文将以上一篇文章中介绍的概念和解决方案为基础。建议您阅读这篇文章,按照其中的指南设置 SharePoint Online 开发环境,然后构建采购解决方案示例,这样,可以深入了解 SharePoint Online 的开发概念。为了说明 SharePoint Online 中的工作流支持,本文将扩展该采购解决方案,使它包含一个工作流解决方案。

SharePoint Designer 2010 概述

通过 SharePoint Designer 2010,高级用户和开发人员无需代码即可自定义 SharePoint 2010。SharePoint Designer 2010 也支持 SharePoint Online,唯一区别是 SharePoint 2010 与 SharePoint Online 的功能(如 BCS 和外部列表支持)有差异。SharePoint Designer 2010 是一个很好的工具,可以导航和管理 SharePoint 中的项目,可以处理数据,还可以自定义 SharePoint 网站的外观。您还可以创建自定义工作流,然后将其部署到整个协作解决方案中。通过视频“面向 SharePoint Online 的 SharePoint Designer 2010 简介” (bit.ly/spdspointro),您可以了解有关 SharePoint Designer 2010 功能的更多信息。SharePoint Designer 2010 可免费下载,它支持 32 位 (bit.ly/spd201032) 和 64 位版本 (bit.ly/spd201064)。

采购解决方案

在本文的示例中,我将以在上一篇文章中介绍的虚构 Contoso Corp. 公司的采购流程为基础,添加一个 SharePoint 工作流来自动执行采购请求审批。在某项采购请求需要审批时,用户将启动该工作流,为该项采购提供业务理由。该工作流将启动审批流程,使用采购详细信息为“审批者”组创建任务。在批准或拒绝之后,将向请求用户发送电子邮件,告知请求结果。然后该工作流检查请求类型,如果是经过批准的旅行请求(如参加技术会议),则创建一个子网站供用户填写旅行报告和上载幻灯片。为此,我将向“Non-Standard Business Purchase Requests”添加一个 RequestType 域。

我更新了上一篇文章中的 PurchaseMgr 项目,将这个 RequestType 域包含在内。如果您已按照这篇文章所述进行操作,则可卸载以前的软件包,部署随本文提供的软件包,或者向“Non-Standard Purchase Requests”列表添加一个必需域 RequestType(带“Travel”、“Equipment”和“Service Request”等选项)。我将从此文档中的代码 (bit.ly/spoworkmsdncode) 开始,将其提取到我的本地计算机上的 Documents\Visual Studio 2010\Projects\SPOMSDN_Workflow 目录中。然后,将 PurchasingMgr.wsp 部署到我的本地 SharePoint 2010 开发环境中网站集的解决方案库中(在此例中为 http://o365dpe.contoso.com/sites/spomsdnmag),然后在我的采购网站 (http://o365dpe.contoso.com/sites/spomsdnmag/purchasing) 中激活“Purchasing Manager–Content Types and Lists”功能。

创建工作流

为了开始开发工作流,我打开本地 SharePoint 2010 开发环境网站上的采购网站,方法是打开 SharePoint Designer 2010,选择“文件”|“网站”|“打开网站”,然后输入我的网站 URL (http://o365dpe.contoso.com/sites/spomsdnmag/purchasing)。在“导航”窗格中,选择“工作流”,显示当前发布的工作流和“工作流”功能区,如图 1 所示。


Workflows in SharePoint Designer 2010(单击进行缩放)

图 1 SharePoint Designer 2010 中的工作流

SharePoint Online 支持对特定列表进行操作的列表工作流、对特定网站进行操作的网站工作流,以及可在以后绑定到列表或特定内容类型的可重用工作流。我希望能够将我的工作流作为整体解决方案的组成部分进行分发,因此,我将创建可重用工作流,这是唯一支持分发的工作流类型。

在 SharePoint Designer 中创建工作流的方法有很多。我可以基于内置工作流(包括“审批”、“收集反馈”或“收集签名”)使用“复制并修改”按钮来创建工作流,可以基于 Microsoft SharePoint 工作流模板使用“从 Visio 导入”按钮导入 Visio 2010 图表,也可以使用功能区的“工作流”选项卡上的“新建”组从头创建工作流。我通过单击功能区的“新建”组中的“可重用工作流”按钮从头创建工作流。在“创建可重用工作流”对话框中,将工作流命名为“Non-Standard Business Purchase Request Approval”,然后选择“Purchasing Manager – Non-Standard Business Purchase Request Content Type”,将工作流与内容类型绑定,如图 2 所示。


Reusable Workflow Bound to the Content Type(单击进行缩放)

图 2 与内容类型绑定的可重用工作流

下一步,通过单击“工作流”选项卡的“管理”组中的“工作流设置”,转到“Non-Standard Business Purchase Request Approval”工作流设置页。

在“设置”组中,选中“在状态页上显示工作流可视化”,以便向我的用户提供每个工作流实例的实时可视状态。我使用“启动选项”组使其成为由人员驱动的工作流,方法是取消选中“禁用手动启动选项”,并选中“禁用在创建/更改项目时自动启动选项”复选框。通过执行相反的操作,可以创建由计算机驱动的工作流。

在很多情况下,完成工作流所需的信息不存储在列表或库中。我可以收集这些信息并将其储存在工作流特定的变量和列中。这是通过“工作流”功能区中的“变量”组完成的,如图 3 所示。

图 3 工作流变量

变量类型 说明
启动表单参数 这个参数用于存储在启动工作流时或将工作流与列表关联后从用户收集的数据。
局部变量 用于存储在处理工作流时使用的数据的私有变量。
关联列 为保证可重用工作流的基本列集而将工作流与列表相关联时添加到列表中的列。

在这种情况下,我需要收集启动该工作流时的采购业务理由,以便将该信息提供给审批者以帮助他们做出决定。为此,单击“变量”|“启动表单参数”|“添加…”,在“添加域”对话框中创建一个“Business Rationale”参数;然后单击“下一步”和“完成”。

在 SharePoint Designer 中实现工作流

此时,已准备好开始实现该工作流,因此,在“工作流设置”选项卡的“编辑组”中选择“编辑器”工作流按钮。现在,进入了 SharePoint Designer 2010 工作流设计器,我可以使用“工作流”功能区的“插入”组中的“条件”、“操作”和“步骤”选项实现工作流(请参见图 4)。


Workflow Designer—Insert Section(单击进行缩放)

图 4 工作流设计器 —“插入”部分

通过步骤可以组织工作流中的条件和操作,以及控制这些条件和操作的执行方式,如图 5 所示。

图 5 步骤类型

步骤类型 说明
步骤 步骤用于组织工作流中的条件和操作。在执行下一步骤之前,必须完成所有条件和操作。可以嵌套。
模拟步骤 工作流是在以手动或自动方式启动工作流的用户的权限下运行的。模拟步骤中的步骤以工作流编写者的身份执行。模拟步骤只能作为工作流中的第一个步骤。在模拟步骤内可以嵌套使用步骤。
并行块 步骤添加到并行块中之后,它们将并行运行,而不是顺序运行。

例如,在图 6 中,步骤 2 以工作流编写者的权限执行,同时步骤 1 以启动该工作流(手动或自动)的用户的身份执行。步骤 5 和 6 将并行执行,而步骤 3 和 4 将顺序执行。

Steps—Effect on Workflow Execution

图 6 步骤 — 对工作流执行的影响

我的工作流中只有一个步骤。为了对条件和操作在步骤中所执行的操作进行存档,我通过单击文本“步骤 1”并输入“Request Purchase Approval”来更改标题。然后,在该步骤内单击,使光标位于需要开始添加操作和条件的位置。

操作在工作流内执行,可能包括启动审批流程、修改列表项、发送电子邮件等。有关所支持的操作的完整列表,请参阅 SharePoint Designer 2010 参考 (bit.ly/spd2010act)。对于此方案,需要为采购请求启动审批流程,因此,我从功能区的“插入”部分选择“操作”下拉列表,然后选择“Start Approval Process”。此操作向设计器中添加一个带超链接的句子,这样,通过选择每个链接并提供更多信息可以完成该操作,如图 7 所示。

Adding the Start Approval Process Action

图 7 添加启动审批流程操作

通过单击“Approval”链接,可以自定义审批任务,包括更改任务的处理方式和任务结果。通过单击“后退”按钮,可以返回到编辑器。单击“these users”链接可以自定义任务和指定参与审批流程的人员。在“选择任务流程参与者”对话框中,选择“审批者”组作为参与者并设置任务标题,如图 8 所示。在“说明”中,需要提供有关该项和业务理由的详细信息,以帮助审批者做出决定。例如,要包括列表项标题,则单击“添加或更改查找”按钮,选择“当前项”作为数据源,选择“标题”作为源域。

Customizing the Approval Task

图 8 自定义审批任务

最后的任务如图 9 所示。

Customized Approval Task

图 9 自定义的审批任务

在工作流执行到此处时,该工作流会暂停,直到任务批准或拒绝,或者任务过期(如果提供了到期日期)。为了控制工作流,我将使用条件。

条件基于工作流变量或域中的值来控制工作流的逻辑。例如,如果该项已获批准,则需要向请求者发送电子邮件,如果请求类型是“Travel”则创建一个网站。如果该项被拒绝,则需要发送电子邮件并将该项删除。为此,将光标放在审批流程下面,单击“条件”下拉列表,然后选择“If any value equals any value”。单击“value”超链接,然后单击显示的按钮以显示“定义工作流查找”对话框。对于“数据源”,选择“工作流变量和参数”;对于“源中的域”,选择“Variable:IsItemApproved”。此变量将在添加“Start Approval Process”任务时添加到工作流。

然后,单击等于链接,从显示的下拉列表中选择等于项。下一步,单击值链接,从下拉列表中选择“Yes”。我在此条件下放置一个 Else-If 块,这样就可以在此项被拒绝时执行操作。向每个分支添加“发送电子邮件”操作,使用字符串生成器设置电子邮件标题,如图 10 所示。

Approval E-mail

图 10 批准电子邮件

下一步,在 If 条件下添加一个“If current item field equals value”条件,使其基于 RequestType 字段,如果请求是旅行请求则创建一个新的子网站。设计器现在如图 11 所示。

The Conditional Flow of the Workflow

图 11 工作流的条件流

为了针对旅行请求创建网站,需要创建一个自定义工作流操作,因为 SharePoint Designer 2010 中没有内置此操作。为此,保存我的工作流,关闭 SharePoint Designer 2010,然后打开 Visual Studio 2010。

在 Visual Studio 2010 中构建自定义工作流操作

可以使用 Visual Studio 2010 和沙盒解决方案向 SharePoint Designer 2010 添加自定义工作流操作。这些操作可以完成可在沙盒解决方案中完成的任何任务,这为 SharePoint Online 工作流提供了很大的灵活性。

在 Visual Studio 2010 中,选择“文件”|“新建项目”;在“新建项目”对话框中,选择 SharePoint 2010 模板和“空白 SharePoint 模板”。输入“PurchasingMgrActions”作为名称,输入“Documents\Visual Studio 2010\Projects\SPOMSDN_Workflow\”作为位置,然后单击“确定”。在 SharePoint 自定义向导中,输入我的本地开发网站 (http://o365dpe.contoso.com/sites/spomsdnmag/purchasing),选择“部署为沙盒解决方案”,然后单击“完成”。

在解决方案资源管理器中,右键单击 PurchasingMgrActions 项目,选择“添加”|“类…”,指定类 CreateSiteAction,然后单击“确定”。CreateSiteAction 类提供了工作流创建新网站需要调用的方法。添加必要的 using 语句并实现 CreateSite 方法,如图 12 中的定义。

图 12 实现 CreateSite 方法

using System;

using System.Collections;



using Microsoft.SharePoint;

using Microsoft.SharePoint.UserCode;



namespace SPDCustomWorkflowActions

{

  public class CreateSiteActivity

  {

    public Hashtable CreateSite(SPUserCodeWorkflowContext context, string siteName)

    {

      Hashtable results = new Hashtable();

      try

      {

        using (SPSite site = new SPSite(context.CurrentWebUrl))

        {

          using (SPWeb web = site.OpenWeb())

          {

            web.Webs.Add(

              siteName,

              "Trip Report: " + siteName,

              string.Empty,

              1033,

              "STS",

              false,

              false);

          }

        }

                

        results["success"] = true;

        results["exception"] = string.Empty;

      }

      catch (Exception e)

      {

        results = new Hashtable();

        results["exception"] = e.ToString();

        results["success"] = false;

      }



      return results;

    }

  }

}

CreateSite 方法遵循自定义操作的方法签名,它传入 SPUserCodeWorkflowContext 以提供对工作流运行上下文和所需所有其他参数(在本例中,即要创建的网站的名称)的访问。 该方法通过该上下文访问网站集 (SPSite) 和网站 (SPWeb),并通过 SPWeb.Webs.Add 方法创建新网站。 结果是通过 Results Hashtable 变量返回的。

为了将 CreateSiteAction 添加到“操作”下拉列表,需要使用 My 功能部署 Elements.xml 文件,以便向 SharePoint Designer 2010 描述该操作。 将此文件添加到项目中,方法是在解决方案资源管理器中选择 PurchasingMgrActions 项目,右键单击并选择“添加”|“新建项…”,然后在“已安装的模板”下选择 SharePoint 2010 并选择空元素模板。 将该项命名为 CreateSiteActionDefinition,然后单击“确定”。 通过在 WorkflowActions 元素中实现一个 Action 元素,可以完成此定义,如图 13 所示。

图 13 通过 Elements.xml 定义创建网站操作

<?xml version="1.0" encoding="utf-8"?>

<Elements xmlns="https://schemas.microsoft.com/sharepoint/">

  <WorkflowActions>

    <Action Name="Create Site"

                      SandboxedFunction="true"

                      Assembly="$SharePoint.Project.AssemblyFullName$"

                      ClassName="PurchasingMgrActions.CreateSiteAction"

                      FunctionName="CreateSite"

                      AppliesTo="all"

                      UsesCurrentItem="true"

                      Category="Purchasing Manager Workflow Actions">

      <RuleDesigner Sentence="Create Site with name %1 (exceptions logged to %2)">

        <FieldBind Field="siteName" Text="Site Name" Id="1" DesignerType="TextBox" />

        <FieldBind Field="exception" Text="Exception" Id="2" 

          DesignerType="ParameterNames" />

      </RuleDesigner>

      <Parameters>

        <Parameter Name="__Context"

                      Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext,

                        Microsoft.SharePoint.WorkflowActions"

                      Direction="In"

                      DesignerType="Hide" />

        <Parameter Name="siteName"

                      Type="System.String, mscorlib"

                      Direction="In"

                      DesignerType="TextBox"

                      Description="Name of the site to create" />

        <Parameter Name="exception"

                      Type="System.String, mscorlib"

                      Direction="Out"

                      DesignerType="ParameterNames"

                      Description="Exception encountered"/>

      </Parameters>

    </Action>

  </WorkflowActions>

</Elements>

Action 元素及其特性描述在工作流中执行操作时将调用的程序集、类和方法。 在本例中,它将调用 CreateSiteAction.CreateSite 方法。 RuleDesigner 元素及其 FieldBind 元素定义将在工作流设计器中显示的句子,以及该句中显示为超链接的域的名称和类型。 Parameters 元素及其 Parameter 子元素定义 RuleDesigner\FieldBind 元素传入到对 CreateSiteAction.CreateSite 的调用和从该调用传出的方式。 例如,__Context 参数的类型为 WorkflowContext,用于将该上下文传递到该调用中而显示在设计器中(通过将 DesigerType 特性设置为“Hide”)。 siteName 参数将接收 siteName 域绑定中的值。 这是通过为域和参数指定相同名称完成的。 出于相同原因,异常将通过异常参数传递出来并传递到异常域中。

在测试自定义操作之前,打开 Feature1,为它提供标题“Purchasing Manager Workflow Actions”使其更具说明性,然后根据需要,通过自定义工作流操作将其范围更改为“网站”。

将工作流解决方案部署到 SharePoint Online

为了测试我的自定义工作流操作,我将在解决方案资源管理器中右键单击 PurchasingMgrActions 项目,然后选择“打包”,将该解决方案打包。 然后,将 PurchasingMgrActions.wsp 上载到本地开发网站集 (http://o365dpe.contoso.com/sites/spomsdnmag) 中的解决方案库以部署自定义工作流操作。

现在,当我打开 SharePoint Designer 2010,在工作流编辑器中打开我的“Non-Standard Business Purchase Request Workflow Approval”工作流时,我的自定义工作流操作会显示在“操作”下拉菜单中的“Purchasing Manager Workflows”类别下,如图 14 所示。

Create Site Custom Action in Workflow Designer

图 14 工作流设计器中的创建网站自定义操作

将 Site Name 变量设置为 Current Item:Title 后,我的工作流就完成了,并准备好进行测试(请参见图 15)。

The Completed Workflow

图 15 已完成的工作流

为了准备进行测试,我需要将该工作流发布到本地开发网站,将它与我的列表相关联。 发布时,在功能区的“保存”部分选择“发布”。 发布完成后,导航到本地开发网站上的“Non-Standard Business Purchase Requests”列表,单击“列表”选项卡,然后在功能区的“设置”部分选择“工作流设置”。 在“这些工作流配置为在此类型的项目上运行”下面,选择“Purchasing Manager – Non-Standard Business Purchase Requests”,然后选择“添加工作流”链接。 选择“Non-Standard Business Purchase Request Approval”工作流作为模板,将该工作流命名为“Non-Standard Business Purchase Approval”,然后依次单击“下一步”和“保存”。

此时,就可以运行工作流了。 选择列表中的第一项,在功能区的“工作流”部分选择“工作流”,然后单击“Non-Standard Business Purchase Approval”工作流将其启动。 然后,系统会提示输入在 Business Rationale 启动表单参数中指定的业务理由。

我会提供一个理由(如此处所示),然后单击“启动”以启动该工作流。 然后,我可以进入到该项的“工作流”页,选择正在运行的工作流以查看“工作流信息”页,此页提供工作流的可视化信息。 任务获批后,图表会进行更新,如图 16 所示。

Workflow Information Page with Visualization
(单击进行缩放)

图 16 提供可视化信息的“工作流信息”页

然后,可以转到“网站操作”|“查看所有网站内容”,查看通过我的自定义工作流操作创建的网站。

现在,我已准备好将工作流解决方案分发到 SharePoint Online。 为了获取我的“Non-Standard Business Purchase Request”工作流的程序包文件,我在 SharePoint Designer 2010 中打开工作流,从功能区的“管理”部分选择“另存为模板”选项,将工作流保存到网站资产库。 然后,可以从网站资产库获取程序包文件 PurchasingMgr.wsp(如果已部署,则可以修改现有列表)、PurchasingMgrActions.wsp 和 Non-Standard Business Purchase Request Approval.wsp,将它们上载到我的 SharePoint Online 网站集中的解决方案库中。 请注意,必须根据功能间的依赖关系,按顺序激活这些功能(可通过功能激活依赖关系自动进行)。 在我的网站中激活该工作流功能并将工作流与我的列表相关联后,可以按相同的步骤在 SharePoint Online 中测试该工作流。

总结

在 SharePoint Online 中通过工作流将业务流程自动化,会使协作更加有效,而不仅仅是在 SharePoint Online 中存储信息。 在本文中,我演示了如何在 SharePoint Designer 2010 中实现一个工作流,通过一个使用 Visual Studio 开发的自定义工作流操作对该工作流加以扩展,然后通过由 SharePoint Designer 2010 和 Visual Studio 2010 创建的程序包文件分发该工作流。 建议您深入探究 SharePoint Online 中的工作流开发。 通过 SharePoint Online 工作流自动执行,容易出错的人工业务流程会变得更加轻松和高效,给用户带来不一般的体验。

Chris Mayo 是一位致力于研究 SharePoint Online 的技术专家,他在 Microsoft 已工作 10 年。他参与编写了“Programming for Unified Communications with Microsoft Office Communications Server 2007 R2”(Microsoft Press, 2009)。在加入 Microsoft 之前,他曾在多家零售和金融领域的《财富》500 强企业的 IT 部门中担任过开发人员和架构师。您可以通过 Mayo 的博客了解其最新消息,地址为 blogs.msdn.com/b/cmayo

衷心感谢以下技术专家对本文的审阅:Mark Kashman、Keenan Newton、AJ MayGeorge Durzi