使用 CorrelationId 上下文更新 Dynamics 365 中的实体

Updating entity in Dynamics 365 using CorrelationId context

我已经在 Dynamics 365 中设置了一个 ServiceEndpoint 来将消息发送到 Azure 服务总线。每当帐户实体有更新时,就会有一条消息排队。 我有一个正在侦听此队列的服务。我的服务正在更新排队的帐户实体上的 属性。

我的代码没有作为插件执行,也没有实现 IPlugin。这意味着我无权访问 IPluginExecutionContext。 为了避免无限循环,我想使用 CorrelationId 作为我的更新调用的上下文。

这可能吗?

事情是这样的:

  1. Soemone 在 Dynamics 365 Online 中更新或创建帐户
  2. 我本地服务器上的服务收到来自 Azure 服务总线的消息
  3. 我解析了传入的JSON
  4. 验证深度不大于 1 以避免无限循环
  5. 我从 Dynamics 中检索帐户实体
  6. 我对自定义字段进行了更新
  7. 我更新了帐户实体 - 这就是它变得棘手的地方!我的更新请求正在生成一条具有不同 CorrelationId 的新消息。我希望更新请求使用传入消息的 CorrelationId,这样我就不会陷入无限循环。

我的呼叫使用 OrganizationServiceProxy

为什么不用RemoteExecutionContext Class

您可以很快将您的 Json(消息) 从 Azure 队列转换为 Dynamics 插件上下文

 private static RemoteExecutionContext GetContext(string contextJson)
        {
            _log.Verbose($"Inside function {nameof(RemoteExecutionContext)}");
            RemoteExecutionContext rv = null;
            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(contextJson)))
            {
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(RemoteExecutionContext));
                rv = (RemoteExecutionContext)ser.ReadObject(ms);
            }
            _log.Verbose($"Exit function {nameof(RemoteExecutionContext)}");
            return rv;
        }

你可以像下面这样称呼它

 RemoteExecutionContext pluginContext = GetContext(receivedBody);

Article post for help

您的问题不在于 RemoteExecutionContext,而在于 Azure 服务总线帐户更新时插件的触发。 您可能知道您可以将帐户更新限制为 运行 仅在您希望的字段而不是所有字段上,即您可以在 ASB 队列中收到有关更新某些帐户字段的消息。

此外,如果你想用代码来处理,还有一个叫做shared variables in Plugins的东西。你可以使用它们。