(MOSS 2007 32 位 SP2)
我有一个在 Visual Studio 中开发的工作流,它被部署为一项功能并与我的列表相关联。该列表中的项目是以编程方式创建的,该过程的最后一步是查看列表中的 SPWorkflowAssociation 集合并启动与特定名称匹配的 WF:
// code to create the list item & get the new item's index (itemIndex)...
foreach (Microsoft.SharePoint.Workflow.SPWorkflowAssociation flowAssoc in SPContext.Current.Web.Lists["{listname}"].WorkflowAssociations) {
if (flowAssoc.Enabled && flowAssoc.AllowManual && (flowAssoc.Name.Trim() == workflowNameToLookFor.Trim()))
SPContext.Current.Site.WorkflowManager.StartWorkflow(SPContext.Current.Web.Lists["{listname}"].Items[itemIndex], flowAssoc, flowAssoc.AssociationData, true);
}
(请原谅丑陋的完全限定名称和 SPListItem 的不断重新获取,除非您认为这实际上应该归咎于某种原因)
这已经在生产中使用了几个月,其中启动的工作流是 SharePoint Designer 工作流。现在我已经部署了我的自定义 WF(名称不同),我得到了一些“奇怪的行为”:
如果我(不是系统帐户,而是网站集管理员)运行代码来创建项目并启动工作流,那么一切都会 100% 运行。但是,如果任何其他用户(即使是对网站和所有相关列表具有完全控制权的人)也这样做,他们会从 SharePoint 获得一个通用的“错误,发生意外错误”页面,但该项目是正确创建的,没有 WF 错误与之关联(该项目的 WF 历史记录完全空白),然后他们可以毫无问题地手动启动指定的工作流。
发生这种情况时,ULS 中生成的唯一错误是:
引擎 RunWorkflow:System.NullReferenceException:对象引用未设置为对象的实例。在 Microsoft.SharePoint.Workflow.SPWorkflowHostServiceBase.LoadInstanceData(Guid instanceId, Boolean&compressedData) 在 Microsoft.SharePoint.Workflow.SPWinOePersistenceService.LoadWorkflowInstanceState(Guid instanceId) 在 System.Workflow.Runtime.WorkflowRuntime.InitializeExecutor(Guid instanceId, CreationContext context, WorkflowExecutor 执行器, WorkflowInstance workflowInstance) 在 System.Workflow.Runtime.WorkflowRuntime.Load(Guid key, CreationContext context, WorkflowInstance workflowInstance) 在 System.Workflow.Runtime.WorkflowRuntime.GetWorkflow(Guid instanceId) 在 Microsoft.SharePoint.Workflow.SPWinOeHostServices.Send(SPWinOeWorkflow winoeworkflow、SPWorkflowEvent e) 在 Microsoft.SharePoint.Workflow。
如果我将要查找的工作流的名称更改为不存在的名称,则根本没有错误(因为我在 FOREACH 中的 IF 语句从未找到匹配项),因此它肯定会找到我的工作流并尝试启动它。
但是(再次),如果我查看生成错误的项目上的工作流状态/历史记录页面,则没有错误或 WF 记录试图从那里开始,并且用户可以从该页面手动启动工作流而无需一个问题。
我正在为 WF 使用 InfoPath 关联表单,但如果这是其根源(例如,如果我需要将某些内容及其数据/架构传递给 WorkflowManager.StartWorkflow),我希望看到同样的错误网站集管理员用户。我没有使用任何形式的 WF 启动表格。
我要疯了,试图找到它的根源。希望有人以前见过这个 ULS 错误或这种行为......