【问题标题】:Microsoft Dynamics CRM - Pass Parameters from Web Service to IPluginsMicrosoft Dynamics CRM - 将参数从 Web 服务传递到 IPlugins
【发布时间】:2014-06-14 09:00:03
【问题描述】:

我们正在通过继承 IPlugin 在 Microsoft Dynamics CRM 中构建一些插件。我们已经对这些进行了配置,以便在更新 Account 时触发它们。

问题是插件正在调用我们的服务,这导致我们的服务响应更新。我们现在正在做一些非常骇人听闻的事情来防止这些周期性更新的发生。

我们想知道是否有办法将值传递给插件可以查看的IOrganizationService 服务(Web 服务)。我们的其他系统可以发送一个标志(“嘿,不要同时发送更新!”)并且插件可以跳过回调。

我们可以将参数从 Web 服务传递给插件吗?

【问题讨论】:

    标签: web-services plugins microsoft-dynamics


    【解决方案1】:

    好主意可能是使用自定义标志字段。例如,您添加位域并将其称为 CallFromExternalSystem。因此,当您通过 IOranizationService 从外部系统进行更新时,您只需使用 true 字段填充此标志,并且在插件中您可以检查该字段是否存在于字段列表中的条件,因此您无需再次调用外部系统端点。

    【讨论】:

    • 我们考虑过在向服务发送更新时设置一个 GUID 字段。不幸的是,这不适用于 SetStateAssign 请求。
    • 在这种情况下 - 您应该定义一些用户帐户(在插件中您可以使用发起的帐户调用)。如果调用该帐户 - 这意味着调用是从外部系统完成的。
    • 并且(如果尚未完成)为每个更新步骤设置过滤属性。如果外部系统和插件不会更新相同的字段,那么这就足够了。如果他们更新相同的字段,您可以查看上下文深度以防止无限递归(我必须承认这不好)。恕我直言,@andrii-butenko 已经给出了所有其他选项(使用标志/不同的调用用户)
    【解决方案2】:

    我们认为正确的解决方案是使用在IPluginExecutionContext.InputParameters["Target"] 中找到的值。对于Update,这将返回一个Entity,其中包含所有已更新属性的属性。

    我们基本上有一个我们关心的属性名称列表。我们遍历名称并查看它们中的任何一个是否出现在实体属性列表中。如果是这样,我们会向我们的其他系统发送更新。好消息是,Dynamics CRM 会忽略值实际未更改的更新,因此尝试将值更新到自身是无操作的。

    public void Execute(IServiceProvider serviceProvider)
    {
        IPluginExecutionContext context = serviceProvider.GetService(typeof(IPluginExecutionContext));
        Entity entity = (Entity)context.InputParameters["Target"];
        string[] fields = new string[] { "name", "statecode", "address1_line1" };
        bool hasUpdates = fields.Where(f => entity.Attributes.Contains(f)).Any();
        if (!hasUpdates)
        {
            return;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      相关资源
      最近更新 更多