通过 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
androidstudio 通过webservice访问sqlserver 求教! 创建了一个webservice 运行正常如 就写了一条简单的