【问题标题】:CRM 3.0 Callouts Running in CRM 4.0 Causing Infinite Loop在 CRM 4.0 中运行的 CRM 3.0 标注导致无限循环
【发布时间】:2010-01-04 17:22:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net dynamics-crm dynamics-crm-4 callouts dynamics-crm-3


    【解决方案1】:

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

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

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 我使用的是标注而不是插件。请参阅我添加到问题中的代码行。我正在考虑添加一个新属性,但令人不安的是,在 crm 3.0 中执行标注时不需要这样做
    • 我发现了这个问题,当我在 crm 3.0 中进行测试时,实体填充了名字字段。在 crm 4.0 中他们没有,并且业务逻辑阻止了这种循环。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2013-03-01
    相关资源
    最近更新 更多