c# - 如何防止 Microsoft Dynamics CRM 2011 中没有 ExecutionContext.CallerOrigin 的无限循环?

标签 c# wcf dynamics-crm infinite-loop dynamics-crm-2011

在 Microsoft Dynamics CRM 4.0 中创建插件时,您可以使用以下方法检查导致插件触发的事件的来源。

public void Execute(IPluginExecutionContext context)
    {
        if (context.CallerOrigin.GetType() == CallerOrigin.WebServiceApi.GetType())
        {
            return;
        }
        plugin code here...
     }

这将允许您检查该操作是否由表单中的用户、Web 服务或工作流等引起...

我有一个通过 WCF 创建和更新实体的同步应用程序,并且不希望插件在发生这种情况时执行,仅在用户编辑实体时执行(以防止同步过程中的无限循环)。

IExecutionContext.CallerOrigin 已在 MS Dynamics CRM 2011 中删除,那么执行此操作的新方法是什么?

我在想可能有一种方法可以在 WCF 调用中设置 IExecutionContext.CorrelationId,然后检查插件中的特定 Guid,但我没有成功还没有。

最佳答案

虽然这似乎已经被问过一段时间了(而且我认为 OP 现在已经找到了他的解决方案!)我最近偶然发现了它来寻找类似的答案。需要进一步研究才能找出我需要什么,因此我也将其添加到此处以供遇到它的任何其他人使用。

首先,如果您正在寻找它,这个属性已经过时了。据说是因为它不可靠,但我们需要 MSCRM 4.0 中的 CallerOrigin 有几个原因。另一方面,也有一些方法可以解决这个问题:

防止无限循环(超过 2 个插件)

这就是我寻找 CallerOrigin 以及我是如何遇到这个问题的原因。我只希望插件在来自表单上的用户时触发,而不是来自另一个插件(即异步进程/网络服务)。在我的例子中,它是“超过 2 个插件”的区别非常重要,因为我无法使用 InputParameters 来解决问题。我的示例类似于以下内容:

  • 为“父”实体更新插件。如果父实体上名为“状态”的选项集设置为“已批准”,我随后想将所有子实体的状态也设置为“已批准”。

  • 为“子”实体更新插件。如果子实体上名为“状态”的选项集设置为“已批准”,并且同一父项的所有其他子项都将此设置为“已批准”,我也需要将父项的状态更新为已批准。

如果您不保护自己免受它的影响,这将导致无限循环。您也不能使用 InputParameters 来解决它。一种基本解决方案是使用深度检查:

context.PluginExecutionContext.Depth

如果它大于 1,则它已被另一个插件/工作流调用。注意:如果您有一个触发初始更新的工作流,您可能需要小心检查要检查的值。

防止离线客户端出现同步问题

我们被赋予了不同的属性来帮助我们区分这些属性。请改用这些:

context.PluginExecutionContext.IsExecutingOffline
context.PluginExecutionContext.IsOfflinePlayback

根据来源的不同做出不同的 react

好的,所以这是我们真正需要 CallerOrigin 的唯一场景。我认为您能够做到这一点的唯一方法是检查 PluginExecutionContext 本身的类型。我知道异步是这样的:

Microsoft.Crm.Asynchronous.AsyncExecutionContext

对于插件来说,它似乎是:

Microsoft.Crm.Extensibility.PipelineExecutionContext

不确定来自外部源时它是什么,不幸的是,我目前没有任何可用代码来测试和解决这个问题。除了您可能需要检查的所有内容之外:

PluginExecutionContext.ParentContext

我遇到的用于检测更新来源的唯一其他方法是在表单上使用自定义标志。因此,您可以使用以下选项创建一个名为“OriginOfChange”(或类似名称)的 OptionSet

  • CRM 表单(JavaScript onsave)
  • 工作流程
  • 插件
  • 等等

然后在更新期间更新实体设置此字段。通过这种方式,您可以每次检查输入参数以查看更新的来源。

如果您需要根据来源做出不同 react ,最后一种方法很可能是最安全的。

关于c# - 如何防止 Microsoft Dynamics CRM 2011 中没有 ExecutionContext.CallerOrigin 的无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6014286/

相关文章:

c# - 更改 DataServiceContext 中的最大消息大小

c# - Large Binary (byte[]) 通过WCF传输文件

dynamics-crm - Dynamics CRM 保存实体更改 - 获取错误

c# - 如何将具有 OData 的 HttpResponseMessage 转换为 C# 对象?

c# - 通过队列消息进行负载均衡时如何处理自动生成的 ID?

c# - 合并两个 Linq lambda 表达式

c# - 在 C# 中执行批处理文件

c# - 如何在 asp.net 应用程序中注销按钮 Windows 身份验证

c# - Asp.net core 3.0 在发布或构建上发布 View 文件 (.cshtml)

c# - 为什么 DataMemberAttribute 需要对 bool 属性进行特殊处理