【问题标题】:How to prevent firing Dynamics CRM Plugin execution while updating an entity using web service?如何在使用 Web 服务更新实体时防止触发 Dynamics CRM 插件执行?
【发布时间】:2020-03-03 14:47:24
【问题描述】:

我已经为我的 Dynamics CRM 实现了一个插件,该插件在事件实体的更新消息上触发。 我还为外部用户提供了一个 Web 服务,它可以从外部仅更新事件实体的两个属性。

问题是当外部用户使用网络服务更新实体时,插件也会触发。 我想绑定在事件实体发生更改时将在 CRM 内部触发的插件,并防止它被外部请求触发。

我在我的插件中检查了以下条件以防止无限循环,它可以工作,但不能用于防止外部更新请求触发。

    if (context.Depth > 1 || 
        context.Mode != 1 || 
        context.MessageName != "Update" || 
        context.IsolationMode != 1)
    {
        return;
    }

要注册插件,我使用了插件注册工具,并将步骤消息设置为更新,并在用户上下文中作为调用用户运行。

在我的网络服务中,我使用 Xrm.SdkXrm.Sdk.Client 连接到 CRM 并直接更新实体。

        ColumnSet cs = new ColumnSet(new string[] {
                "description", "statuscode"
            });            
        Guid recordId = new Guid(caseID);            
        Entity currentRecord = crmService.Retrieve("incident", recordId, cs);
        OptionSetValue osv = new OptionSetValue(1);
        currentRecord["statuscode"] = osv;
        currentRecord["new_answers"] = answer;
        currentRecord["new_lastanswerdate"] = currentDate;
        crmService.Update(currentRecord);

任何人都有任何想法 - 当实体从 CRM 外部更新时,如何防止插件触发?

【问题讨论】:

  • 由于您使用的是调用用户,您可以在插件执行上下文中通过InitiatingUserId获取有关用户的信息。使用 Guid,您可以检查您的用户表并确定它们是否是外部的
  • @Chronicle 是否需要定义专门用于通过 Web 服务连接到 CRM 的特定用户?如果是,我可以将哪个角色分配给新用户凭据以限制任何其他操作?
  • 如果您创建了一个自定义角色并只为 Web 服务用户分配此角色,那么这是一种限制插件功能的方式 - 如果用户具有该角色,请检查您的代码,否则返回。但它不一定是角色,您也可以在用户表中添加一个标志字段,并为该用户设置该标志,这样您就不必为每个服务添加新角色
  • 看看这个:应用程序用户(非交互式用户)docs.microsoft.com/en-us/power-platform/admin/…
  • 感谢@Chronicle,将插件执行绑定到除新用户之外的所有用户都运行良好。

标签: c# plugins dynamics-crm


【解决方案1】:

插件在每个服务器事务中执行并被触发,这是预期的行为(这就是全部目的)。

您可以使用仅由外部集成更新/使用的其他标志(附加属性或任何服务帐户),在这种情况下,您可以检查执行上下文/目标实体并忽略进一步的执行。

对于外部集成 - 您应该创建一个应用程序用户(非交互式服务帐户)。 Read more

【讨论】:

    猜你喜欢
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多