1

我重新编译了一个 CRM 3.0 标注库并将它们部署到我的 CRM 4.0 实例中。我的 PostUpdate 标注之一调用 service.Update()。这导致更新方法多次触发。它最终由于超时错误而停止。当这些标注与 CRM 3.0 一起使用时,不会发生这种情况。

此自定义代码的入口点的方法签名如下。

public override void PostUpdate(CalloutUserContext userContext, CalloutEntityContext entityContext, string preImageEntityXml, string postImageEntityXml)
4

1 回答 1

1

IPluginExecutionContext 的属性之一是深度。这表明您的插件正在执行的插件“调用堆栈”中的“深度”。当您在 CRM 表单上按保存时,您从深度 1 开始。每次更新后调用更新时,深度都会增加。

你会发现有些人会在执行他们的插件逻辑之前检查深度是否等于 1。然而,这并不适合所有人。如果工作流要更新此实体,则深度将为 2(工作流为 1,现在您的更新为 2)。

当深度达到 8 时,CRM 停止执行,称为递归。我不确定您是否真的遇到了超时或此错误。自从我看到他们抛出什么错误以来已经很长时间了。

我们在整个解决方案中开发了自定义代码,我们必须检查递归。我无法分享所有这些,但如果你喜欢,你可以有这个想法。

另一个想法是为您的实体添加自定义属性。不要把它放在表格上。通常,该属性不会存在于您的更新属性包中。当您从代码中调用 update 时,下次应该使您的更新插件短路时,请设置该属性。如果设置了属性,您将短路并且不处理插件。

希望这可以帮助。

于 2010-01-04T18:26:05.780 回答