通过 List Webservice 更新列表项来触发 SharePoint 工作流

Posted

技术标签:

【中文标题】通过 List Webservice 更新列表项来触发 SharePoint 工作流【英文标题】:Firing a SharePoint Workflow by updating a list item through List Webservice 【发布时间】:2010-09-13 03:12:48 【问题描述】:

我正在开发一个简单的 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>

项目正在更新(时间戳已更改,并且也是一个虚拟属性),但工作流不会重新开始。

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

检查错误日志(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.

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


我会随时通知您有关此主题的任何进展。

【问题讨论】:

上周我们在 Lists.asmx Web 服务和工作流中看到了这种行为,场景非常相似。在这一点上,我们正在通过额外的 Web 服务调用来解决这个问题,这些调用复制了工作流功能。我很想听听您遇到的任何进展! @barryd:你认为你的workaroung会在生产中使用吗?您是否找到了一种在外部触发工作流程的方法?我已经在 microsoft 客户支持服务处开立了一个案例。我希望他们能让我们解决这个问题。当然,我会在这里发布任何消息! 【参考方案1】:

最后,我们通过了 Microsoft 的支持服务流程并找到了解决方案!

首先,Microsoft 声明这是一个错误。这是一个小错误,因为有一个很好的解决方法,所以可能需要更长的时间才能修复这个错误(支持技术人员说下一个服务包或下一个版本(!))。

但是现在解决问题。

原因

让我们看一下我的问题中的 CAML 代码:

<Method ID='1' Cmd='Update'>
  <Field Name='ID'>1</Field>
  <Field Name='myDummyPropertyField'>NewValue</Field>
</Method>

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

The object specified does not belong to a list.

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

解决方案

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

<Field Name='FileRef'>/sites/mySite/myDocLib/myFolder/myDocument.txt</Field>

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>

未来

也许这种未记录的行为将在即将推出的服务包之一中得到修复,也许不会。 Microsoft 支持部门已致歉,并将发布有关此主题的 MSDN 文章。在接下来的一个月里,我希望这篇关于 *** 的文章能够帮助处于相同情况的开发人员。

感谢阅读!

【讨论】:

【参考方案2】:

我们在审批工作流程中遇到了类似的问题。 为了解决这个问题,我们编写了自己的事件接收器并将其附加到列表中。 根据项目是更新还是编辑,我们随后触发了审批工作流程。

希望这会有所帮助...

【讨论】:

这听起来不错。我们正在与微软支持部门联系,并等待那里的建议。但这似乎是一条路。【参考方案3】:

我也遇到过这个问题,发现工作流一旦启动,无论您如何更新项目,都无法自动重新启动。但是,您可以根据需要多次手动重新启动工作流。

【讨论】:

【参考方案4】:

我看到了同样的行为。但随后您会收到posts like this,向人们展示如何每天创建一个来设置电子邮件提醒。

【讨论】:

以上是关于通过 List Webservice 更新列表项来触发 SharePoint 工作流的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WebService (java) 上返回 List<T>

如何通过单击 v-list 项 vue + vuetify 来选择 v-radio

如何使用 List.js 更新一个列表

androidstudio 通过webservice访问sqlserver 求教! 创建了一个webservice 运行正常如 就写了一条简单的

webservice返回数据量太大,导致超时怎么办?

使用jersey restful webservice生成.csv文件