演练:结合使用 SharePoint 完全信任工作流活动与 Business Connectivity Services

本演练主题演示如何为使用 Microsoft Business Connectivity Services (BCS) 的工作流创建完全信任活动。它处理一个基本费用批准方案,该方案使用工作流通过 Business Connectivity Services 从外部系统获取审批者和安全限制值。这些值对应于给定雇员(由雇员 ID 指定)和费用类型。

上次修改时间: 2015年3月9日

适用范围: SharePoint Server 2010

本演练主题基于 BCS 完全信任工作流活动示例,后者是 Microsoft SharePoint 2010 软件开发工具包 (SDK) 的一部分。有关如何获取此示例的详细信息,请参阅代码示例:BCS 完全信任工作流活动示例

完全信任活动是采用 Microsoft Visual Studio 编写的,并需要注意以下事项:

  • 安装在全局程序集缓存中。

  • 将 .actions 文件放在服务器场中每台服务器的文件系统中的工作流模板文件夹中。

  • 将 AuthorizedTypes 条目包含在每台服务器上的 web.config 文件中,以允许执行程序集。必须将其部署在每台场服务器上,因此需要更高的权限和更详细的审查。

有关 BCS 操作用法和常见错误的提示

可在以下情况下使用 Business Connectivity Services 的完全信任工作流活动:

  • 您具有部署完全信任活动的权限。

  • 您希望执行下列操作之一:

    • 在已设置或未设置外部列表的情况下,从工作流读取、创建和更新外部系统中的数据。

    • 尽量减少对外部系统的调用。

    • 使用需要在多个项目或关联与其他外部内容类型之间循环的复杂逻辑,而不使用沙盒解决方案。

在使用完全信任工作流活动时,请注意以下几点:

  • 顾名思义,完全信任活动以完全信任方式运行。这意味着您在部署活动之前,应确切知道该活动的目的并信任该活动的创建者(将其视为管理员)。

  • 如果是在 Microsoft SharePoint Designer 中使用该活动,则必须返回固定数量的项目,因为 SharePoint Designer 不支持循环。

构建完全信任工作流活动

将在此操作方法中构建的活动返回与给定类型的费用和雇员 ID 对应的审批者和安全限制。已将有关外部内容类型的信息内置到活动中,并且该活动仅对该外部内容类型起作用。

创建工作流活动

本演练完成的方案与如何:创建沙盒工作流操作中的相同。不过,此处不使用外部列表,而是仅使用 Business Data Connectivity (BDC) Service API 实现该方案的目标。这比只读取列表中的项目复杂一些,因为与简单列表相比,BDC API 可提供更大的灵活性。在查看代码之前,您应了解该活动公开的属性。尽管已公开该活动的所有属性以便可在 SharePoint Designer 中对其进行编辑,但仍内置了一些默认值,这样您就不比输入应在部署期间保持一致的有关这些值的信息。

表 1. 工作流活动属性示例

名称

说明

EntityName

外部内容类型的名称。将示例中的此值硬编码为默认值,但可以在"属性"网格中替代此值。在生产环境中,您可能根本不希望将 EntityName、EntityNamespace 和 LobSystemIsntanceName 传递到活动中。这是因为 SharePoint Designer 的任何用户可能随后会将工作流更改为指向其他外部内容类型,并可能获取他(或她)不应拥有的信息。此处显示了其中大多数属性,以便您可以轻松查看代码的工作方式。

EntityNamespace

外部内容类型的命名空间。将示例中的此值硬编码为默认值,但可以在"属性"网格中替代此值。

LobSystemInstanceName

外部系统的实例名称。SharePoint Designer 中的所有实例名称都是您在发现外部系统时键入的名称。但在 SharePoint Designer 外部创建的外部内容类型可以具有多个名称,因此您需要指定一个名称。将示例中的此值硬编码为默认值,但可以在"属性"网格中替代此值。

EmployeeID

将查找的雇员 ID。

Category

费用类别。本示例中的实现支持将"活动费"、"设备"和"差旅"作为此参数的唯一有效输入。

Approver

此值从外部系统返回给用户,是应审批费用的用户。

SafeLimit

此值从外部系统返回给用户。它是对该特定用户以及该费用类型的限制。

若要了解此示例的工作方式,请查看 BDCReadActivity.cs 中的活动代码。请注意,所有代码都包含在 Execute 方法中,工作流主机将为执行活动而调用此方法。在此调用中,要执行的第一项 BDC 操作是获取包含 SafeLimits 外部内容类型的元数据存储,如下面的代码所示。

private IMetadataCatalog GetMetadataCatalog(SPSite site, ISharePointService hostInterface)

该代码看起来很简单,但需要注意一些事项。首先,目录是服务器场范围内目录,而不是网站范围内目录。这意味着该活动将在使用同一 BDC 服务的任何网站上运行。其次,如果未找到项目,则用于获取元数据存储的 SharePoint API 将返回 null。这不同于 BDC API,它在未找到项目时将引发异常。

在获取元数据存储后,您必须查找外部内容类型并返回正确的数据,如下面的方法示例所示。

private void GetSafeLimits(IMetadataCatalog catalog, ISharePointService hostInterface)

在此代码示例中,应注意 GetEntity 位于 try/catch 块中,因此如果删除外部内容类型,或它不在此目录中,将会引发 MetadataObjectNotFoundException 异常。要处理此异常,可在工作流历史记录列表中添加一个条目,以通知您此异常,然后重新引发它,这会使工作流失败。

在获取外部内容类型后,您必须查找该外部内容类型的特定实例。为此,请使用 IEntity 的 FindSpecific 方法。此方法采用两个参数。第一个参数是特定实例的 Identity。在此示例中,将 EmployeeID 设置为标识符,因此需要将 EmployeeID 作为 Identity 进行传递。此时您可以查看该标识如何特定于外部内容类型。另一个外部内容类型可能具有名称甚至类型均不同的其他标识符。第二个参数是用于查找项目的外部系统实例。如前所述,因为您使用的是 SharePoint Designer,所以只有一个外部系统实例,并且您使用的名称存储在该实例的代码中。还应注意,如果未找到该项目,FindSpecific 会引发以下另一个异常:ObjectNotFoundException。同样,您需要捕获此异常并将友好错误返回给用户,然后重新引发此异常,以使工作流失败。在获取实体实例后,剩余的工作就很简单了。您可以使用方括号中的字段名称来获取该实例的值。

使用下面的步骤可基于 BCS 完全信任工作流活动示例创建工作流。

设置示例

  1. 按照代码示例:BCS 完全信任工作流活动示例中的步骤操作,下载并安装 BCS 完全信任工作流活动示例。

  2. 在 SharePoint Designer 中,创建一个名为 SafeLimits 的外部内容类型(包含命名空间 BCSBlog)以及一个名为 SafeLimit 的外部系统实例。请注意,这些值在活动代码示例中进行了硬编码。还要确保外部内容类型具有下列七个字段:EmployeeID、EquipmentLimit、EquipmentApprover、MoraleLimit、MoraleApprover、TravelLimit 和 TravelApprover。

    备注

    必须使用包含此处所列字段的数据结构设置外部系统,例如数据库。

  3. (可选)要验证外部内容类型,可以创建一个外部列表。

  4. 在 Visual Studio 2010 中打开解决方案。

  5. 构建该解决方案。

    这会生成 BCSReadActivity.dll,该活动部署在前端 Web 服务器的全局程序集缓存 (%windir%\assembly) 中,以便 SharePoint Server 可以查找和加载它。

    在构建解决方案之前,应确保 EntityName、EntityNamespace, 和 LobSystemInstanceName 的默认值已更新为与您的设置相匹配。在 GetSafeLimits 方法中定义了这些值。

  6. 部署该解决方案。

    1. 将程序集添加到每台 SharePoint 场服务器上的 web.config 文件中。

      1. 在场服务器上打开 SharePoint 网站的 web.config 文件。

      2. 在底端部分,查找 <System.Workflow.ComponentModel.WorkflowCompiler>。在此标记内,应查找 <authorizedTypes> 部分以及每组类型对应的条目。添加以下行(确保类型信息正确,包括公钥标记)。

        <authorizedType Assembly="BCSReadActivity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=90f597110ccda6ac" Namespace="Microsoft.SharePoint.Samples" TypeName="SafeLimitActivity" Authorized="True" />
        
    2. 在每台 SharePoint 场服务器上部署 BCSReadActivity.ACTIONS 文件。

      1. 在每台场服务器上,将 BCSReadActivity.ACTIONS 复制到 SharePoint 服务器安装文件夹中的以下文件夹中:%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\template\1033\workflow。

        备注

        1033 是代表美国英语区域设置的 LCID。如果使用其他区域设置,此文件夹名称将有所不同。

      2. 在每台场服务器上执行 iisreset 命令。

创建工作流

  1. 为费用报表创建一个文档库并将其命名为 ExpenseReports

  2. 添加以下列:

    • EmployeeID

    • ExpenseType 作为选择字段,其中包含下列选项:"活动费"、"设备"和"差旅"

    • Approver

    • Limit

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

  4. 为工作流命名并提供相关说明,然后单击"确定"。

    备注

    此时,可在工作流设计器中开始添加所需操作。

  5. 插入"获取雇员的安全限制"操作。

    1. 将前两个参数保留原样。它们是函数中 Approver 和 SafeLimit 的输出变量。

    2. 对于第三个参数,指定"类别"。已在列表上对此进行定义,因此可以和以前一样,借助函数 (fx) 按钮并使用 CurrentItem 来选取"开支类型"列。

    3. 对于最后一个参数,借助函数 (fx) 按钮并使用 CurrentItem 来选取"雇员 ID"列。

      您会看到如图 1 所示的新列表工作流。

      图 1. Microsoft SharePoint Designer 中的新列表工作流

      Microsoft SharePoint Designer 中的新建列表工作流

  6. 添加另一项操作,用于从函数写入 Approver 和 SafeLimit 的输出变量。

    1. 插入"更新列表项"操作。

    2. 单击"此列表"链接。

    3. 单击"添加",然后选择"审批者"。

    4. 在"查找单行文本"对话框中,单击"fx"按钮。

    5. 对于"数据源",选择"工作流: 变量和参数"。

    6. 对于"源中的域",选择"变量: 审批者"。

    7. 关闭该对话框。

    8. 重复步骤 c 到 g,为 SafeLimit 添加变量。

  7. 保存该工作流,然后发布它。

备注

在运行该工作流之前,请确保在 BDC 模型中为外部系统和外部内容类型设置了正确的权限,以便该工作流可以访问这些资源。另外,建议将 Secure Store Service 用作 BDC 模型的身份验证类型。有关 Business Connectivity Services 中工作流的详细信息,请参阅如何:结合使用 Business Connectivity Services 与 SharePoint 工作流

运行工作流

  1. 使用数据填充外部系统。

  2. 在 ExpenseReports 文档库中创建一个项目。确保已添加的雇员 ID 和费用类型值位于外部系统中。

  3. 触发该工作流。

    文档库项目中的 Approver 和 SafeLimit 值字段应由工作流使用外部系统中的值进行填充。