SharePoint 外接程序模型中的工作流、操作(活动)、事件和表单

Summary

在新 SharePoint 外接程序模型中实现工作流及其关联组件的方法与使用完全信任代码不同。 在典型的完全信任代码 (FTC)/场解决方案中,工作流及其关联组件使用服务器端代码构建,并由 SharePoint 解决方案部署。 工作流及其关联组件在 SharePoint 服务器上运行。

在 SharePoint 外接程序模型方案中,工作流及其关联组件由运行在远程服务器上的代码开发。 工作流及其关联组件使用工作流服务注册,但所有代码在远程服务器上执行。

高级别准则

作为经验法则,我们希望提供以下高级别准则,以在新的 SharePoint 外接程序模型中创建工作流及其关联组件。

  • 通常情况下,工作流后面的代码在 Office 365 租户中或对于 SharePoint 外接程序模型不可用。
  • 后面与工作流及其关联组件相关的所有代码必须在运行在远程服务器上的外部 Web 服务中被替代。

创建自定义工作流及其关联组件的方法

有几种创建自定义工作流及其关联组件的方法

  • 创建自定义工作流
  • 创建自定义工作流活动
  • 创建自定义工作流事件
  • 创建自定义工作流表单

创建自定义工作流

此方法中,创建和部署了自定义工作流,并将其与 SharePoint 中的主机 Web 相关联。

  • 可使用 Visual Studio 或 SharePoint Designer 创建自定义工作流。
  • 在 SharePoint 中,可使用多种方法部署自定义工作流,并将其与主机 Web 相关联。
    • 在 Visual Studio 中创建的工作流将自动打包到功能内以用于部署。
    • SharePoint Designer 中创建的工作流必须导出和导入以将其从开发服务器部署到生产服务器。
    • 还可通过远程预配模式部署工作流并将其与 SharePoint 中的主机 Web 相关联。 若要详细了解远程预配模式,请参阅网站预配(SharePoint 加载项方法)

以下代码示例演示了如何使用 CSOM 来预配工作流及支持工作流的列表。

	public void ProvisionIncidentWorkflowAndRelatedLists(string incidentWorkflowFile, string suiteLevelWebAppUrl, string dispatcherName)
    {
		//Return the list the workflow will be associated with
        var incidentsList = CSOMUtil.GetListByTitle(clientContext, "Incidents");

		//Create a new WorkflowProvisionService class instance which uses the 
		//Microsoft.SharePoint.Client.WorkflowServices.WorkflowServicesManager to
		//provision and configure workflows
        var service = new WorkflowProvisionService(clientContext);

		//Read the workflow .XAML file
        var incidentWF = System.IO.File.ReadAllText(incidentWorkflowFile);

		//Create the WorkflowDefinition and use the 
		//Microsoft.SharePoint.Client.WorkflowServices.WorkflowServicesManager
		//to save and publish it.  
		//This method is shown below for reference.
        var incidentWFDefinitionId = service.SaveDefinitionAndPublish("Incident",
            WorkflowUtil.TranslateWorkflow(incidentWF));

		//Create the workflow tasks list
        var taskListId = service.CreateTaskList("Incident Workflow Tasks");

		//Create the workflow history list
        var historyListId = service.CreateHistoryList("Incident Workflow History");

		//Use the Microsoft.SharePoint.Client.WorkflowServices.WorkflowSubscriptionService to 
		//subscibe the workflow to the list the workflow is associated with, register the
		//events it is associated with, and register the tasks and history list. 
		//This method is shown below for reference.
        service.Subscribe("Incident Workflow", incidentWFDefinitionId, incidentsList.Id,
            WorkflowSubscritpionEventType.ItemAdded, taskListId, historyListId);
    }
	
	public Guid SaveDefinitionAndPublish(string name, string translatedWorkflows)
    {
        var definition = new WorkflowDefinition(ClientContext)
        {
            DisplayName = name,
            Xaml = translatedWorkflows
        };

        var deploymentService = workflowServicesManager.GetWorkflowDeploymentService();
        var result = deploymentService.SaveDefinition(definition);
        ClientContext.ExecuteQuery();

        deploymentService.PublishDefinition(result.Value);
        ClientContext.ExecuteQuery();

        return result.Value;
    }

	public Guid Subscribe(string name, Guid definitionId, Guid targetListId, WorkflowSubscritpionEventType eventTypes, Guid taskListId, Guid historyListId)
    {
        var eventTypesList = new List<string>();
        foreach (WorkflowSubscritpionEventType type in Enum.GetValues(typeof(WorkflowSubscritpionEventType)))
        {
            if ((type & eventTypes) > 0)
                eventTypesList.Add(type.ToString());
        }

        var subscription = new WorkflowSubscription(ClientContext)
        {
            Name = name,
            Enabled = true,
            DefinitionId = definitionId,
            EventSourceId = targetListId,
            EventTypes = eventTypesList.ToArray()
        };

        subscription.SetProperty("TaskListId", taskListId.ToString());
        subscription.SetProperty("HistoryListId", historyListId.ToString());

        var subscriptionService = workflowServicesManager.GetWorkflowSubscriptionService();
        var result = subscriptionService.PublishSubscriptionForList(subscription, targetListId);

        ClientContext.ExecuteQuery();
        return result.Value;
    }

何时适合?

需使用自定义工作流后面的代码创建自定义工作流时,此选项非常适合。

入门

以下文章演示了如何创建自定义工作流。

创建自定义工作流活动

此方法中,创建了自定义工作流活动,并将其部署到 SharePoint。

  • 可使用 Visual Studio 创建自定义工作流活动。
  • 可能无法使用 SharePoint Designer 创建自定义工作流活动。
  • 定义工作流活动部署到 SharePoint 环境后,可在 SharePoint Designer 中使用它们。

何时适合?

需在 SharePoint Designer 中工作流操作的现有库无法满足业务流程的要求的业务流程中实现工作流时

入门

以下文章说明了如何使用 Visual Studio 创建自定义工作流活动。

Workflow.Activities(O365 PnP 示例)包括几个使用 Visual Studio 创建的自定义工作流活动。 它还演示了如何在工作流中使用自定义工作流活动。

创建自定义工作流事件

此方法创建了自定义工作流事件,并将其部署到 SharePoint。

  • 可使用 Visual Studio 创建自定义工作流事件。
  • 可能无法使用 SharePoint Designer 创建自定义工作流事件。
  • 自定义工作流事件部署到 SharePoint 环境后,可在 SharePoint Designer 中使用它们。

何时适合?

在业务流程(该业务流程要求需要工作流在继续下一个步骤前等待自定义事件)中实现工作流时。

入门

Workflow.CustomEvents(O365 PnP 示例)展示了如何创建等待自定义事件触发才继续运行的工作流。 它还演示了如何使用工作流服务管理器的 JavaScript 客户端对象模型 (JSOM) 来引发自定义事件。

创建自定义工作流表单

此方法创建了自定义工作流表单,并将其部署到 SharePoint。

  • 可使用 Visual Studio 创建自定义工作流表单。
  • 可能无法使用 SharePoint Designer 创建自定义工作流表单。
  • 自定义工作流表单部署到 SharePoint 环境后,可在 SharePoint Designer 中使用它们。

何时适合?

在业务流程(该业务流程要求需要自定义表单)中实现工作流时。

入门

以下文章说明了如何创建自定义工作流关联和启动表单,以及如何在工作流中使用它们。

Workflow.CustomTasks(O365 PnP 示例)演示了如何创建自定义任务和启动表单,以及如何在工作流中使用它们。

从自定义工作流更新 SharePoint 数据的方法

有几种从自定义工作流更新 SharePoint 数据的方法。

  • 使用上下文令牌和外接程序 Web URL 向 SharePoint 验证。
  • 使用外接程序 Web URL 和 SharePoint Web 代理向 SharePoint 验证。

使用上下文令牌和外接程序 Web URL 向 SharePoint 验证

此方法中,将上下文令牌和外接程序 Web URL 从工作流传递到工作流通过 http 头调用的服务。 此服务使用上下文令牌和外接程序 Web URL 向 SharePoint 验证,并在更新 SharePoint 数据前,返回一个访问令牌。

  • 此方法需要将内容令牌从工作流传递到 Web 服务。

何时适合?

当你希望与 SharePoint 的通信出现在客户端级别时。

入门

以下示例演示了如何使用上下文令牌和外接程序 Web URL 对 SharePoint 进行验证并更新 SharePoint 数据。

有关将上下文令牌和外接程序 Web URL 从工作流传递到服务的详细信息,请参阅 Workflow.CallCustomService(O365 PnP 示例)自述文件中的调用 Web Api 服务部分。

Workflow.CallCustomService(O365 PnP 示例)自述文件中的其他部分提供了有关整个工作流及其远程服务的详细信息,并引导你设置 Microsoft Azure 中的所有组件。

使用外接程序 Web URL 和 SharePoint Web 代理向 SharePoint 验证

在此方法中,当工作流开始时,将外接程序 Web URL 从工作流传递到工作流调用的服务。 该服务将外接程序 Web URL 传递到 SharePoint Web 代理。 SharePoint Web 代理使用外接程序 Web URL 向 SharePoint 验证,并返回一个访问令牌。 然后,SharePoint Web 代理在调用以更新 SharePoint 数据前,将向 http 头追加访问令牌。

  • 此方法无需将内容令牌从工作流传递到 Web 服务。

何时适合?

当你希望与 SharePoint 的通信出现在服务器级别时。

入门

以下示例演示了如何使用外接程序 Web URL 和 SharePoint Web 代理向 SharePoint 验证并更新 SharePoint 数据。

有关 SharePoint Web 代理调用的详细信息,请参阅 Workflow.CallServiceUpdateSPViaProxy(O365 PnP 示例)自述文件中的通过 Web 代理调用 Web Api 服务部分。

Workflow.CallServiceUpdateSPViaProxy(O365 PnP 示例)自述文件中的其他部分提供了整个工作流和远程服务的详细信息,并引导你设置 Microsoft Azure 中的所有组件。

有关 SharePoint Web 代理的详细信息,请参阅使用 SharePoint 2013 中的 Web 代理查询远程服务(MSDN 文章)(#使用-sharepoint-2013-中的-web-代理查询远程服务(msdn-文章))。

PnP 示例

适用于

  • Office 365 多租户 (MT)
  • Office 365 专用 (D)
  • SharePoint 2013 本地