工作流启动时出现SharePoint 2007 ULS错误System.NullReferenceException

时间:2011-08-16 21:33:06

标签: sharepoint sharepoint-2007 sharepoint-workflow

(MOSS 2007 32bit 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中唯一产生的错误是:

  

Engine RunWorkflow:System.NullReferenceException:未将对象引用设置为对象的实例。在System.Workflow.Runtime.WorkflowRuntime.InitializeExecutor的Microsoft.SharePoint.Workflow.SPWinOePersistenceService.LoadWorkflowInstanceState(Guid instanceId)中的Microsoft.SharePoint.Workflow.SPWorkflowHostServiceBase.LoadInstanceData(Guid instanceId,Boolean& compressedData)(Guid instanceId,CreationContext context,WorkflowExecutor)执行者,WorkflowInstance workflowInstance)在System.Workflow.Runtime.WorkflowRuntime.Load(Guid键,CreationContext上下文,WorkflowInstance workflowInstance),位于Microsoft.SharePoint.Workflow.SPWinOeHostServices.Send的System.Workflow.Runtime.WorkflowRuntime.GetWorkflow(Guid instanceId)上。 SPWinOeWorkflow winoeworkflow,SPWorkflowEvent e)在Microsoft.SharePoint.Workflow.SPWinOeEngine.RunWorkflow(Guid trackingId,SPWorkflowHostService主机,SPWorkflow工作流,Collection`1事件,TimeSpan timeOut)

如果我改变工作流程的名称,我正在寻找不存在的东西,根本没有错误(因为我的FOREACH中的IF语句永远找不到匹配),所以它肯定找到了我的工作流程并尝试启动它。

但是(再次),如果我查看生成错误的项目的“工作流程状态/历史记录”页面,则没有错误或记录WF曾试图从那里开始,并且从该页面用户可以手动启动工作流程没有问题。

使用WFS的InfoPath关联表单,但是如果它是这个的根源(例如,如果我需要将其数据/模式传递给WorkflowManager.StartWorkflow)我我希望我的网站集管理员用户看到相同的错误。我没有使用任何类型的WF启动表。

我很难找到这个的来源。希望有人在......之前看到过这种ULS错误或这种行为。

1 个答案:

答案 0 :(得分:0)

还没有真正找到原因,但我能够解决它......

重置所有站点内容中的每个列表/库以继承站点的权限,并在站点级别为我的测试用户提供完全控制后,我仍然从测试用户那里收到错误/失败。但是,如果我授予我的测试用户网站集管理员权限(这是SC下的子网站/网站,即http://mossServer/sites/SC/thisSite/),那么一切正常。

因此,我将此站点设置为从SC重新获取其权限,然后打破继承并在此“正常”组中添加回此站点(测试用户所在的)具有Contribute和Approve权限,并且摆脱了来自SC的所有明显不适用的条目。现在一切都适合测试用户。

我仍然有一些无关的组可以访问我需要清理的网站,但我不认为我的测试用户在其中任何一个,所以我不认为他们是不同的。我想某种方式(我错误地将“一个小的权限清理”改变与我的新WF的部署一起)我打破了“隐藏”(不是在所有网站内容中可见的任何对象)权限分配,这对于这个过程(虽然我仍然感到困惑,因为用户能够看到WF并在他们创建的项目上手动启动它。)

如果我发现其他任何内容,我会留下评论,但似乎从网站集重新加入权限修复了任何已损坏的内容。