Microsoft Dynamics CRM - 将参数从Web服务传递到IPlugins

时间:2014-04-28 17:27:26

标签: web-services plugins microsoft-dynamics

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我们认为正确的解决方案是使用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;
    }
}