插件为单个事件执行4次

时间:2013-03-20 16:03:06

标签: dynamics-crm-2011

什么可能导致插件从单个事件中执行4次?
该插件已在Case的检索中注册,并为单个检索触发4次。

        protected void ExecutePostCaseRetrieve(LocalPluginContext localContext)
        {
        if (localContext == null)
        {
            throw new ArgumentNullException("localContext");
        }

        // TODO: Implement your custom Plug-in business logic.
        IOrganizationService service = localContext.OrganizationService;
        QueryByAttribute query = new QueryByAttribute("resource");
        query.Attributes.AddRange("name");
        query.Values.AddRange("Employee");
        EntityCollection result = service.RetrieveMultiple(query);
        Guid employee = result.Entities[0].Id;
        QueryScheduleRequest scheduleRequest = new QueryScheduleRequest
        {
            ResourceId = employee,
            Start = DateTime.Now.ToLocalTime(),
            End = DateTime.Now.ToLocalTime().AddMonths(1),
            TimeCodes = new TimeCode[] { TimeCode.Available }
        };
        QueryScheduleResponse schedule = (QueryScheduleResponse)service.Execute(scheduleRequest);
        DateTime today = DateTime.Now.ToLocalTime();
        if (today.Date.Equals(schedule.TimeInfos[0].Start.Value.Date)) // today is a working day
        {
            service.Create(new Lead { FirstName = today.Hour.ToString() });
        }
        else // just escalate from beginning of next working day
            service.Create(new Lead { FirstName = schedule.TimeInfos[0].Start.Value.ToLocalTime().ToString(), LastName=schedule.TimeInfos[0].End.Value.ToLocalTime().ToString() });

enter image description here

我尝试过同步和异步,同样的事情发生了。

2 个答案:

答案 0 :(得分:1)

除了要归咎于一个错误(我怀疑是的情况)之外,对插件进行四重触发的唯一合理方法是从它自己调用它。这个答案的问题在于这样的设置通常会导致永久的递归和屏幕上的噗声。

关于原因的猜测,我意识到你的问题中有四次重新调用,并且CRUD有四种基本操作。可能是依赖吗?

编辑:

正如我的MVP总是说的那样。在这种情况下,在尝试解释为什么发生之前,找出 的位置。在某些情况下,他是对的。

所以,这就是我在这种情况下所做的事情。

以下列表中的术语* magic *表示这组操作:删除 Case Lead 的所有实例,创建一个 Case的单个实例并查看 Lead 的实例数。

  1. 删除所有插件。做魔术
  2. 注册"空"插件创建 案例。做魔术
  3. 向插件添加潜在客户的创建(Service.Create(new Entity("case")); )。做魔术
  4. 将现有代码中的内容复制/粘贴到新代码中。做魔术
  5. 您也可以尝试全新安装,以确保没有其他软件发生碰撞。这是一个30天免费试用期。我在任何时候都有大约10个不同的试验。 :)

答案 1 :(得分:0)

我知道这篇文章已经有一年了,但我遇到了另一个插件触发了我的第一个插件时遇到了同样的问题。 crm服务实际上有一个深度属性,您可以使用该属性来确定在此之前触发了多少操作。

在要执行的代码之前放置这样的东西可以解决这个问题。

if (context.depth > 1 ){
return;
}