我重新编译了一个CRM 3.0标注库,并将它们部署到我的CRM 4.0实例中。我的一个PostUpdate标注调用service.Update()。这导致更新方法多次触发。它最终会因超时错误而停止。当这些标注与CRM 3.0一起使用时,不会发生这种情况。
此自定义代码的入口点的方法签名如下所示。
public override void PostUpdate(CalloutUserContext userContext, CalloutEntityContext entityContext, string preImageEntityXml, string postImageEntityXml)
答案 0 :(得分:1)
IPluginExecutionContext上的一个属性是深度。这表明你的插件正在执行插件'call-stack'的“深度”。当您在CRM表单上按“保存”时,您将从深度为1开始。每次更新后调用更新时,深度都会增加。
你会发现有些人会在执行插件逻辑之前检查深度是否等于1。然而,这不适合所有人。如果工作流程要更新此实体,则深度将为2(工作流程为1,现在您的更新为2)。
当深度达到8时,CRM停止执行,称其为递归。我不确定你是否真的遇到了超时或这个错误。自从我看到他们抛出什么错误以来已经很久了。
我们在整个解决方案中开发了自定义代码,我们必须检查递归。我无法分享所有这些,但如果你喜欢,你可以有这个想法。
另外一些想法是为您的实体添加自定义属性。不要把它放在表格上。通常,您的更新属性包中不存在该属性。当您从下一次应该使更新插件短路的代码调用更新时,请设置该属性。如果设置了属性,则会短路而不处理插件。
希望这有帮助。