簡體   English   中英

使用CSOM創建Project Server 2016工作流

[英]Creating Project Server 2016 Workflow with CSOM

查看以下信息:

https://dev.office.com/sharepoint/docs/general-development/working-with-the-sharepoint-workflow-services-client-side-object-model

https://sharepoint.stackexchange.com/questions/159432/programmatically-create-workflow-with-javascript-jsom-and-sp-workflowservices-w

我正在嘗試為Project Server 2016創建站點工作流 - 這意味着它的平台類型必須是SharePoint 2013 Workflow - Project Server

就像stackexchange上的問題一樣,首先我從spd 2013創建了示例工作流,保存為模板,並將生成的xaml重新生成到我的xaml字符串。

ProjectContext psContext = new ProjectContext(Strings.PWA_Url);
var web = psContext.Web;
var siteCollection = psContext.Site;
var tasksList = web.Lists.GetByTitle("Project Server Workflow Tasks");
var historyList = web.Lists.GetByTitle("Project Server Workflow History");
string xaml = "<Activity mc:Ignorable="mwaw" x:Class="Test.MTW" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:local="clr-namespace:Microsoft.Office.Project.Server.WorkflowActivities" xmlns:local1="clr-namespace:Microsoft.SharePoint.WorkflowServices.Activities" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mwaw="clr-namespace:Microsoft.Web.Authoring.Workflow;assembly=Microsoft.Web.Authoring" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Sequence><Sequence><mwaw:SPDesignerXamlWriter.CustomAttributes><scg:Dictionary x:TypeArguments="x:String, x:String"><x:String x:Key="InitBlock">InitBlock-7751C281-B0D1-4336-87B4-83F2198EDE6D</x:String></scg:Dictionary></mwaw:SPDesignerXamlWriter.CustomAttributes></Sequence><Flowchart StartNode="{x:Reference __ReferenceID1}"><FlowStep x:Name="__ReferenceID1"><mwaw:SPDesignerXamlWriter.CustomAttributes><scg:Dictionary x:TypeArguments="x:String, x:String" /></mwaw:SPDesignerXamlWriter.CustomAttributes><Sequence><mwaw:SPDesignerXamlWriter.CustomAttributes><scg:Dictionary x:TypeArguments="x:String, x:String"><x:String x:Key="StageAttribute">StageContainer-8EDBFE6D-DA0D-42F6-A806-F5807380DA4D</x:String></scg:Dictionary></mwaw:SPDesignerXamlWriter.CustomAttributes><local:EnterProjectStage StageId="296334d9-1621-e711-80c8-00155d014d18"><mwaw:SPDesignerXamlWriter.CustomAttributes><scg:Dictionary x:TypeArguments="x:String, x:String"><x:String x:Key="StageAttribute">StageHeader-7FE15537-DFDB-4198-ABFA-8AF8B9D669AE</x:String></scg:Dictionary></mwaw:SPDesignerXamlWriter.CustomAttributes></local:EnterProjectStage><Sequence DisplayName="Inicjalizacja"><local1:SetWorkflowStatus Disabled="False" Status="Entering stage: Inicjalizacja" /></Sequence><local:ExitProjectStageGate><mwaw:SPDesignerXamlWriter.CustomAttributes><scg:Dictionary x:TypeArguments="x:String, x:String"><x:String x:Key="StageAttribute">StageFooter-3A59FA7C-C493-47A1-8F8B-1F481143EB08</x:String></scg:Dictionary></mwaw:SPDesignerXamlWriter.CustomAttributes></local:ExitProjectStageGate></Sequence><FlowStep.Next><FlowStep x:Name="__ReferenceID0"><mwaw:SPDesignerXamlWriter.CustomAttributes><scg:Dictionary x:TypeArguments="x:String, x:String"><x:String x:Key="Next">4294967294</x:String></scg:Dictionary></mwaw:SPDesignerXamlWriter.CustomAttributes><Sequence><mwaw:SPDesignerXamlWriter.CustomAttributes><scg:Dictionary x:TypeArguments="x:String, x:String"><x:String x:Key="StageAttribute">StageContainer-8EDBFE6D-DA0D-42F6-A806-F5807380DA4D</x:String></scg:Dictionary></mwaw:SPDesignerXamlWriter.CustomAttributes><local:EnterProjectStage StageId="e10db6c9-1721-e711-80c8-00155d014d18"><mwaw:SPDesignerXamlWriter.CustomAttributes><scg:Dictionary x:TypeArguments="x:String, x:String"><x:String x:Key="StageAttribute">StageHeader-7FE15537-DFDB-4198-ABFA-8AF8B9D669AE</x:String></scg:Dictionary></mwaw:SPDesignerXamlWriter.CustomAttributes></local:EnterProjectStage><Sequence DisplayName="Akceptacja"><local1:SetWorkflowStatus Disabled="False" Status="Entering stage: Akceptacja" /></Sequence><local:ExitProjectStageGate><mwaw:SPDesignerXamlWriter.CustomAttributes><scg:Dictionary x:TypeArguments="x:String, x:String"><x:String x:Key="StageAttribute">StageFooter-3A59FA7C-C493-47A1-8F8B-1F481143EB08</x:String></scg:Dictionary></mwaw:SPDesignerXamlWriter.CustomAttributes></local:ExitProjectStageGate></Sequence></FlowStep></FlowStep.Next></FlowStep><x:Reference>__ReferenceID0</x:Reference></Flowchart></Sequence></Activity>"
psContext.Load(web);
psContext.Load(siteCollection);
psContext.Load(tasksList);
psContext.Load(historyList);
psContext.ExecuteQuery();

WorkflowServicesManager wfServiceManager = new WorkflowServicesManager(psContext, web);
WorkflowDeploymentService deployService = wfServiceManager.GetWorkflowDeploymentService();
WorkflowSubscriptionService subscriptionService = wfServiceManager.GetWorkflowSubscriptionService();

WorkflowDefinition wfDefinition = new WorkflowDefinition(psContext);
wfDefinition.DisplayName = "TestWorkflow";
wfDefinition.Description = "TestWorkflow";
wfDefinition.Xaml = xaml;
wfDefinition.RestrictToType = "Site";

deployService.SaveDefinition(wfDefinition);

psContext.Load(wfDefinition, i => i.Id);
psContext.ExecuteQuery();

Guid subscriptionID = Guid.NewGuid();
WorkflowSubscription subscription = new WorkflowSubscription(psContext);
subscription.Id = subscriptionID;
subscription.Name = "TestWorkflow";
subscription.DefinitionId = wfDefinition.Id;
subscription.EventSourceId = web.Id;
subscription.EventTypes = new List<string>() { "WorkflowStart" };
subscription.SetProperty("HistoryListId", historyList.Id.ToString("B"));
subscription.SetProperty("TaskListId", tasksList.Id.ToString("B"));

subscriptionService.PublishSubscription(subscription);
psContext.ExecuteQuery();

但是這給了我最后一行代碼的錯誤:

Microsoft.SharePoint.Client.ServerException:'Microsoft.Workflow.Client.ActivityNotFoundException:來自作用域'/ SharePoint / default / ec283308-a234-4501-9df1-99744cf4a5fe / b0993915-25fa-43f6-9839-8aa683f16ef2的名為'WorkflowXaml_a2a3ddfc_8e29_488c_a7fa_110ad2e869fd'的活動' 沒有找到。 從服務器收到的HTTP標頭 - ActivityId:e4085f69-addc-4c3e-8bcc-49c2f04daf7c。 NodeId:SERVER。 范圍:/ SharePoint / default / ec283308-a234-4501-9df1-99744cf4a5fe / b0993915-25fa-43f6-9839-8aa683f16ef2。 客戶端ActivityId:fa0ef59d-8566-1053-095'

這里沒有線索。

我通過使用Fiddler嗅探SharePoint Designer 2013 CSOM通信來實現此目的。

實現這一目標的關鍵是:

wfDefinition.SetProperty("IsProjectMode", "true");
// (...)
subscription.EventSourceId = new Guid("5122D555-E672-4E5D-A7C4-8084E694A257");
subscription.SetProperty("Microsoft.ProjectServer.ActivationProperties.CurrentStageId", "");
subscription.SetProperty("Microsoft.SharePoint.ActivationProperties.ParentContentTypeId", "");
subscription.SetProperty("Microsoft.ProjectServer.ActivationProperties.ProjectId", "");
subscription.SetProperty("Microsoft.ProjectServer.ActivationProperties.RequestedStageId", "");

注釋屬性均由SPD設置,但不是必需的。

工作代碼:

ProjectContext psContext = new ProjectContext(Strings.PWA_Url);
var web = psContext.Web;
var siteCollection = psContext.Site;
var tasksList = web.Lists.GetByTitle("Project Server Workflow Tasks");
var historyList = web.Lists.GetByTitle("Project Server Workflow History");

psContext.Load(web, i => i.Id);
psContext.Load(siteCollection, i => i.Id);
psContext.Load(tasksList, i => i.Id);
psContext.Load(historyList, i => i.Id);
psContext.ExecuteQuery();

WorkflowServicesManager wfServiceManager = new WorkflowServicesManager(psContext, web);
WorkflowDefinition wfDefinition = new WorkflowDefinition(psContext);

Guid subscriptionID = Guid.NewGuid();
wfDefinition.DisplayName = "TestWorkflow";
wfDefinition.Description = "TestWorkflow";
wfDefinition.Xaml = Strings.Workflow_Simple;
wfDefinition.SetProperty("isReusable", "false");
wfDefinition.SetProperty("IsProjectMode", "true");
//wfDefinition.SetProperty("AutosetStatusToStageName", "false");
//wfDefinition.SetProperty("SPDConfig.LastEditMode", "TextBased");
wfDefinition.SetProperty("RestrictToType", "Site");
wfDefinition.SetProperty("TaskListId", tasksList.Id.ToString("B"));
wfDefinition.SetProperty("HistoryListId", historyList.Id.ToString("B"));
//wfDefinition.SetProperty("SPDConfig.StartManually", "true");
//wfDefinition.SetProperty("SPDConfig.StartOnCreate", "false");
//wfDefinition.SetProperty("SPDConfig.StartOnChange", "false");
//wfDefinition.SetProperty("FormField", "&lt;Fields /&gt;");
//wfDefinition.SetProperty("RequiresInitiationForm", "false");
//wfDefinition.SetProperty("InitiationUrl", "");
//wfDefinition.SetProperty("SubscriptionId", subscriptionID.ToString("B"));
//wfDefinition.SetProperty("SubscriptionName", "TestWorkflow");
WorkflowDeploymentService deployService = wfServiceManager.GetWorkflowDeploymentService();
deployService.SaveDefinition(wfDefinition);

psContext.Load(wfDefinition, i => i.Id);
psContext.ExecuteQuery();

deployService.PublishDefinition(wfDefinition.Id);
psContext.ExecuteQuery();

WorkflowSubscription subscription = new WorkflowSubscription(psContext);
subscription.Id = subscriptionID;
subscription.Name = "TestWorkflow";
subscription.EventSourceId = new Guid("5122D555-E672-4E5D-A7C4-8084E694A257");
subscription.EventTypes = new List<string>() { "WorkflowStart" };
subscription.DefinitionId = wfDefinition.Id;
//subscription.SetProperty("CreatedBySPD", "1");
subscription.SetProperty("CurrentWebUri", Strings.PWA_Url_Https);
subscription.SetProperty("HistoryListId", historyList.Id.ToString("B"));
subscription.SetProperty("Microsoft.ProjectServer.ActivationProperties.CurrentStageId", "");
//subscription.SetProperty("SharePointWorkflowContext.ActivationProperties.SiteId", siteCollection.Id.ToString("B"));
subscription.SetProperty("TaskListId", tasksList.Id.ToString("B"));
subscription.SetProperty("Microsoft.SharePoint.ActivationProperties.ParentContentTypeId", "");
//subscription.SetProperty("SharePointWorkflowContext.ActivationProperties.WebId", web.Id.ToString("B"));
subscription.SetProperty("Microsoft.ProjectServer.ActivationProperties.ProjectId", "");
subscription.SetProperty("Microsoft.ProjectServer.ActivationProperties.RequestedStageId", "");

WorkflowSubscriptionService subscriptionService = wfServiceManager.GetWorkflowSubscriptionService();
subscriptionService.PublishSubscription(subscription);
psContext.ExecuteQuery();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM