通过列表Web服务更新列表项来触发SharePoint工作流
我正在开发一个应绑定到文档库的简单SharePoint顺序工作流。将小工作流程与文档库关联时,我检查了以下选项
- 允许经过身份验证的用户使用"编辑项目权限"手动启动此工作流程。
- 创建新项目时启动此工作流程。
- 更改项目时启动此工作流程。
现在,我将文档上载到该库,然后工作流程开始,例如发送邮件。它完成了,一切都很好。
当我在新项目上选择"编辑属性"并保存更改时,将再次触发工作流程。绝对是我们所期望的。
即使在借助Copy.asmx Web服务将新项目复制到库中时,工作流也可以正常启动。
但是现在我想通过SharePoint WebService Lists.asmx更新该项目。
我的CAML在这里:
<Method ID='1' Cmd='Update'> <Field Name='ID'>1</Field> <Field Name='myDummyPropertyField'>NewValue</Field> </Method>
该项目正在更新(更改了时间戳和一个哑属性),但是工作流没有再次开始。
此行为在我们的开发和测试系统上是可重现的。
检查错误日志(C:\ Program Files \ Common Files \ Microsoft Shared \ Web服务器扩展\ 12 \ LOGS),我发现一条奇怪的错误消息:
09/25/2008 16:51:40.17 w3wp.exe (0x1D94) 0x1D60 Windows SharePoint Services General 6875 Critical Error loading and running event receiver Microsoft.SharePoint.Workflow.SPWorkflowAutostartEventReceiver in Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c. Additional information is below. : The object specified does not belong to a list.
有人可以确认这种行为吗?或者任何解决方案提示?
我会随时通知我们有关此主题的任何进展。
解决方案
我也遇到了这个问题,发现工作流程一旦启动,无论我们如何更新项目,都无法自动重新启动它。但是,我们可以根据需要多次手动重新启动工作流程。
审批工作流程也遇到了类似的问题。
为了解决这个问题,我们编写了自己的事件接收器并将其添加到列表中。
根据项目是否已更新或者编辑,我们随后触发了批准工作流程。
希望这可以帮助...
我已经看到了相同的行为。但是随后我们会收到类似这样的帖子,向人们展示了如何每天创建一个帖子来设置电子邮件提醒。
最后,我们了解了Microsoft的支持服务流程,并找到了解决方案!
首先,微软表示这是一个错误。这是一个小错误,因为有一个很好的解决方法,所以可能需要更长的时间才能修复此错误(支持技术人员在下一个Service Pack或者下一个版本(!)中说了一些话。
但是现在是问题所在。
街区
让我们从我的问题看一下CAML代码:
<Method ID='1' Cmd='Update'> <Field Name='ID'>1</Field> <Field Name='myDummyPropertyField'>NewValue</Field> </Method>
由于任何原因,工作流管理器均无法使用该ID,因此我们在第二行中输入了该信息。奇怪的是,所有其他SharePoint命令都使用ID,但不使用工作流管理器。工作流管理器使用"完全合格"的文档名称。因此,由于我们没有任何线索,也没有输入任何完全限定的文档名称,因此工作流管理器默认为当前文档库的名称。现在,错误消息开始变得有意义了:
The object specified does not belong to a list.
当然,对象(文档库)不属于列表,而是列表。
解决方案
我们必须在CAML查询中再添加一行:
<Field Name='FileRef'>/sites/mySite/myDocLib/myFolder/myDocument.txt</Field>
FileRef将完全合格的文档名称传递给工作流管理器,该工作流管理器现在非常高兴地启动了项目的工作流。
请注意,我们必须包括完整的绝对服务器路径,并省略服务器名称(例如,可以在SPItem的ServerRelativePath属性中找到)。
完整的CAML查询:
<Method ID='1' Cmd='Update'> <Field Name='ID'>1</Field> <Field Name='FileRef'>/sites/mySite/myDocLib/myFolder/myDocument.txt</Field> <Field Name='myDummyPropertyField'>NewValue</Field> </Method>
未来
也许这种未记录的行为将在即将到来的Service Pack之一中得到修复,也许不是。 Microsoft支持表示歉意,并将发布有关此主题的MSDN文章。在下个月,我希望这篇关于stackoverflow的文章能对同样情况的开发人员有所帮助。
谢谢阅读!