【问题标题】:Is there a way to differentiate from SSIS execution vs web UI execution in a CRM 4.0 plugin?有没有办法在 CRM 4.0 插件中区分 SSIS 执行与 Web UI 执行?
【发布时间】:2011-08-17 21:35:38
【问题描述】:

设置如下:

Custom_entity 从用户那里获取一些输入,计算一个数字,并将其与存储在我们数据库中的总数进行比较,以获得总体百分比。总数每周更新一次。为了更新每个用户的 custom_entities 以反映新的总数和这些总数的百分比,我创建了一个每周运行的 SSIS 包。当然,我很好而且顺从,所以我使用 API 来访问 CRM 网络服务来更新 custom_entities。

然而,用户也希望看到他们的 custom_entity 的实时更新,所以我创建了一个插件,在 custom_entity 更新时将重新计算他​​们的数字,检查“总”,并更新与所有其他更新相关的百分比。

也许你现在看到了问题......

  • 当用户从网络更新时,更新插件会针对该 custom_entity 实例触发,他们会得到即时反馈,看到他们的数字并且很高兴。
  • 当 SSIS 包运行时,更新插件会触发 ALL 正在更新的 custom_entity 行...

我的问题: 有没有办法(可能通过查看上下文)可以判断插件是通过 SSIS 作业还是通过 Web 调用的,然后退出插件?

目前行数很少,并没有真正影响性能,但很明显,这肯定是糟糕的编程和不必要的 CPU/带宽使用(插件本身在整个过程中多次访问 web 服务执行)。我可以通过查找仅在 SSIS 包调用插件时才会出现的特定属性来短路插件,但我想找到比这更好的方法。

谢谢!

【问题讨论】:

    标签: web-services plugins ssis dynamics-crm-4 crm


    【解决方案1】:

    您可以查看context.CallerOrigin 属性。它将向您显示触发消息的来源。在您的情况下,您应该检查WebServiceApi

    using System;
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.SdkTypeProxy;
     
    public class OnlinePlugin : IPlugin
    {
      public void Execute(IPluginExecutionContext context)
      {
         // Check to see if this is a playback context.
         CallerOrigin callerOrigin = context.CallerOrigin;
      
         if (callerOrigin is OfflineOrigin)
         {
           // This plug-in was fired from the playback queue after the user
           // selected to go online within Microsoft Dynamics CRM for Outlook.
           return;
         }
         else
         {
           // Do something here.
         }
      }
    }
    

    看看我的文章Who triggered my plugin?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      相关资源
      最近更新 更多