解決自定義代碼啟動Approver - Sharepoint 2010 Workflow,出現Failed on Start
Posted on 2012-06-07 22:52 SkyPurple 閱讀(770) 評論(1) 收藏 舉報將一個webservice項目add到 sharepoint webapplication中,通過外部程序調用這個webservice進行簡要的sharepoint常規操作。
在Site collection future中啟用workflow. 使用sharepoint 自帶的兩個workflow.
1.feedback workflow
2. Approver - Sharepoint 2010 workflow
代碼片段:
var replaceSpace = new Regex(@"\s{1,}", RegexOptions.IgnoreCase);
var list = common.GetList(rootweb, listName);//rootweb.Lists.TryGetList(listName);
if (null == list)
{
workflowResultEnum = WorkflowResultEnum.HaveNotWorkflow;
return;
}
var currentUserName = replaceSpace.Replace(userprofile.DisplayName, ".");
currentUserName = currentUserName + "_Approver-Sharepoint2010";
var currentUserWorkflowAssociation = list.WorkflowAssociations.GetAssociationByName(currentUserName,
System.Globalization
.CultureInfo.
CurrentCulture);
if (null == currentUserWorkflowAssociation)
{
var rootWebWorkflowTemplateCollection = rootweb.WorkflowTemplates;
var approverTemplate = rootWebWorkflowTemplateCollection.GetTemplateByName(approverWorkflowName,
System.Globalization.CultureInfo.CurrentCulture);
if (null == approverTemplate)
{
workflowResultEnum = WorkflowResultEnum.HaveNotWorkflow;
return;
}
currentUserWorkflowAssociation = SPWorkflowAssociation.CreateListAssociation(approverTemplate,
currentUserName,
tasksList,
workflowHistory);
list.WorkflowAssociations.Add(currentUserWorkflowAssociation);
currentUserWorkflowAssociation.Enabled = true;
list.Update();
}
var buildApproverWorkflowXml = new BuildApproverWorkflowXml(currentUserWorkflowAssociation.AssociationData);
var personaSharepoints = new List<PersonaSharepoint>();
foreach (var spUserId in selectUsers)
{
var spUser = rootSiteUsers.GetByID(spUserId);
if (null == spUser) continue;
var personaSharepoint = new PersonaSharepoint
{
DisplayName = spUser.Name,
AccountId = spUser.LoginName,
AccountType = "User"
};
personaSharepoints.Add(personaSharepoint);
}
currentUserWorkflowAssociation.AssociationData = buildApproverWorkflowXml.Build(personaSharepoints, requestText, customerDateTime);
var item = list.GetItemByUniqueId(itemUniqueId);
if (null == item)
{
workflowResultEnum = WorkflowResultEnum.HaveNotWorkflow;
return;
}
item.Web.Site.WorkflowManager.StartWorkflow(item, currentUserWorkflowAssociation,
currentUserWorkflowAssociation.AssociationData,true);
rootweb.AllowUnsafeUpdates = false;
其中SP代碼做的操作是獲取workflowAssociation,未找到便根據相應模版創建workflowAssociation.以及創建和檢查task List和workflowhistory List;
該workflow的associationdata的XML格式為:
View Code
<dfs:myFields xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dms="http://schemas.microsoft.com/office/2009/documentManagement/types" xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" xmlns:q="http://schemas.microsoft.com/office/infopath/2009/WSSList/queryFields" xmlns:d="http://schemas.microsoft.com/office/infopath/2009/WSSList/dataFields" xmlns:ma="http://schemas.microsoft.com/office/2009/metadata/properties/metaAttributes" xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<dfs:queryFields></dfs:queryFields>
<dfs:dataFields>
<d:SharePointListItem_RW>
<d:Approvers>
<d:Assignment>
<d:Assignee />
<d:Stage xsi:nil="true" />
<d:AssignmentType>Serial</d:AssignmentType>
</d:Assignment>
</d:Approvers>
<d:ExpandGroups>true</d:ExpandGroups>
<d:NotificationMessage />
<d:DueDateforAllTasks xsi:nil="true" />
<d:DurationforSerialTasks xsi:nil="true" />
<d:DurationUnits>Day</d:DurationUnits>
<d:CC />
<d:CancelonRejection>false</d:CancelonRejection>
<d:CancelonChange>false</d:CancelonChange>
<d:EnableContentApproval>false</d:EnableContentApproval>
</d:SharePointListItem_RW>
</dfs:dataFields>
<dfs:queryFields></dfs:queryFields>
<dfs:dataFields>
<d:SharePointListItem_RW>
<d:Approvers>
<d:Assignment>
<d:Assignee />
<d:Stage xsi:nil="true" />
<d:AssignmentType>Serial</d:AssignmentType>
</d:Assignment>
</d:Approvers>
<d:ExpandGroups>true</d:ExpandGroups>
<d:NotificationMessage />
<d:DueDateforAllTasks xsi:nil="true" />
<d:DurationforSerialTasks xsi:nil="true" />
<d:DurationUnits>Day</d:DurationUnits>
<d:CC />
<d:CancelonRejection>false</d:CancelonRejection>
<d:CancelonChange>false</d:CancelonChange>
<d:EnableContentApproval>false</d:EnableContentApproval>
</d:SharePointListItem_RW>
</dfs:dataFields>
將該workflow綁定在一個listitem中,并啟動。啟動方式為自動啟動,當調用webservice后未發現異常信息,但是在sharepoint界面發現啟動失敗。

查看LOGS日志后發現該日志信息:
06/07/2012 15:37:27.62 w3wp.exe (0x23CC) 0x2860 SharePoint Foundation Workflow Infrastructure 72fs Unexpected RunWorkflow: Microsoft.SharePoint.SPException: <Error><CompilerError Line="0" Column="0" Text="Application configuration file is either missing or does not contain authorizedTypes related configuration information." /></Error> at Microsoft.SharePoint.Workflow.SPNoCodeXomlCompiler.LoadXomlAssembly(SPWorkflowAssociation association, SPWeb web) at Microsoft.SharePoint.Workflow.SPWinOeHostServices.LoadDeclarativeAssembly(SPWorkflowAssociation association) at Microsoft.SharePoint.Workflow.SPWinOeHostServices.CreateInstance(SPWorkflow workflow) at Microsoft.SharePoint.Workflow.SPWinOeEngine.RunWorkflow(SPWorkflowHostService host, SPWorkflow workflow, Collection`1 events, TimeSpan timeOut) at Microsoft.SharePoint.Workflow.SPWorkflowManager.RunWorkflowElev(SPWorkflow workflow, ...
06/07/2012 15:37:27.62* w3wp.exe (0x23CC) 0x2860 SharePoint Foundation Workflow Infrastructure 72fs Unexpected ...Collection`1 events, SPWorkflowRunOptionsInternal runOptions)
搜索之后發現在微軟網站有如下解釋:
大致意思是有問題的話是System account替你Cancelled的。接下來,無論我提高任何權限都無法調用自己的webservice啟動workflow.
后來在這個帖子下發現有回復說需要在config文件中增加sectiongroup節點;
浙公網安備 33010602011771號