通过List Webservice更新列表项来触发SharePoint Workflow

Joh*_*ich 16 sharepoint workflow web-services autostart

我正在开发一个简单的SharePoint顺序工作流,它应绑定到文档库.将小工作流程与文档库关联时,我检查了这些选项

  • 允许具有"编辑项目权限"的经过身份验证的用户手动启动此工作流.
  • 创建新项目时启动此工作流程.
  • 更改项目时启动此工作流程.

现在我将文档上传到此库,工作流程启动,例如发送邮件.它完成了,一切都很好.

当我在新项目上选择编辑属性并保存更改时,将再次触发工作流程.绝对是我们的期望.

即使在Copy.asmx Webservice的帮助下将新项目复制到库中,工作流程也会正常启动.

现在我想通过SharePoint WebService Lists.asmx更新项目.

我的CAML在这里:

<Method ID='1' Cmd='Update'>
  <Field Name='ID'>1</Field>
  <Field Name='myDummyPropertyField'>NewValue</Field>
</Method>
Run Code Online (Sandbox Code Playgroud)

项目正在更新(时间戳已更改并且还具有虚拟属性)但工作流程不会再次启动.

这种行为可以在我们的开发测试系统上重现.

检查错误日志(C:\ Program Files\Common Files\Microsoft Shared\web server extensions\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.
Run Code Online (Sandbox Code Playgroud)

有谁可以证实这种行为?或任何解决方案提示?


我随时向您通报有关该主题的任何进展.

Joh*_*ich 11

最后,我们完成了Microsoft的支持服务流程并获得了解决方案!

首先,微软称这是一个错误.这是一个小错误,因为有一个很好的解决方法,所以可能需要一些更长的时间,直到这个错误将被修复(支持技术人员说下一个服务包或下一个版本(!)的东西).

但现在为了这个问题.

reaseon

我们来看看我的问题中的CAML代码:

<Method ID='1' Cmd='Update'>
  <Field Name='ID'>1</Field>
  <Field Name='myDummyPropertyField'>NewValue</Field>
</Method>
Run Code Online (Sandbox Code Playgroud)

由于任何原因,Workflow Manager无法使用ID,我们在第二行输入.奇怪的是,所有其他SharePoint命令都使用ID,但不使用Workflow Manager.Workflow Manager使用"完全限定"的文档名称.因此,由于我们没有任何线索并且未输入任何完全限定的文档名称,因此Workflow Manager默认使用当前文档库的名称.现在错误消息开始有意义:

The object specified does not belong to a list.
Run Code Online (Sandbox Code Playgroud)

当然,对象(文档库)不属于列表,它是列表.

解决方案

我们必须在CAML查询中再添加一行:

<Field Name='FileRef'>/sites/mySite/myDocLib/myFolder/myDocument.txt</Field>
Run Code Online (Sandbox Code Playgroud)

FileRef将完全限定的文档名称传递给Workflow Manager,它现在非常开心 - 启动项目的工作流程.

请注意,您必须包含完整的绝对服务器路径,省略您的服务器名称(例如,在您的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>
Run Code Online (Sandbox Code Playgroud)

未来

也许这种未记录的行为可能会在即将推出的一个服务包中修复,也许不会.Microsoft支持道歉,并将发布有关此主题的MSDN文章.对于下个月,我希望关于stackoverflow的这篇文章能够帮助开发人员处理相同的情况.

谢谢阅读!