无法在CRM 2011中保存更新插件中的更改

时间:2013-11-23 21:23:52

标签: dynamics-crm-2011

我已经使用PreImage为Update创建了一个插件。当实体发生变化时,插件将会触发。

在插件中我调用了一个webservice,我想在一个字段中保存webservice响应。但插件不会改变我的想法。当我使用Service.Update时,插件会因工作流程循环而出错。

    if (context.InputParameters.Contains("Target") && (context.InputParameters["Target"] is Entity))
    {
        Entity entity2 = (Entity)context.InputParameters["Target"];
        Entity PreImageEntity = (Entity)context.PreEntityImages["PreImage"];
        if (entity2.LogicalName == "ppp_sentsms")
        {
            QueryExpression expression3 = new QueryExpression("ppp_sentsms");
            ColumnSet set2 = new ColumnSet();
            set2.AllColumns = true;
            expression3.ColumnSet = set2;
            ConditionExpression item = new ConditionExpression();
            item.AttributeName = "ppp_sentsmsid";
            this.CurrentSmsGuid = (Guid)entity2.Attributes["ppp_sentsmsid"];
            item.Values.Add(this.CurrentSmsGuid);
            FilterExpression expression5 = new FilterExpression();
            expression5.Conditions.Add(item);
            expression3.Criteria = expression5;

            EntityCollection entitys2 = service.RetrieveMultiple(expression3);
            string strResponceValue = "";
            string strResponceValuePreImage = "";
            foreach (Entity smsentity in entitys2.Entities)
            {
                if (smsentity.Attributes.Contains("ppp_status") && smsentity.Attributes.Contains("ppp_webserviceid"))
                {
                    strResponceValuePreImage = PreImageEntity["ppp_status"].ToString();
                    strResponceValue = CheckSMSStatus(this.username, this.password, smsentity["ppp_webserviceid"].ToString());
                    if (strResponceValue.Trim() != strResponceValuePreImage.Trim())
                    {
                        entity2["ppp_status"] = strResponceValue;
                       // service.Update(smsentity);
                    }
                }
            }
        }

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

我在谷歌搜索后发现了这个问题。我在后期操作中注册了更新步骤。我必须在预先操作中注册。

无需service.Update(smsentity);

CRM 2011: Plugin to update fields of current record

答案 1 :(得分:1)

您收到引用无限循环的错误的原因:

插件在更新时注册,并自行更新记录。这意味着该插件可以有效地调用自己。

CRM具有无限循环检测机制,如果触发,将抛出异常以阻止插件(或工作流)运行。这是一个有用的工具 - 没有它,上面的插件将永远循环,或者更确切地说,直到它迫使你的服务器倒下。

插件上下文中的一个字段,称为“深度”,可以告诉您循环。它是一个int值(默认值为1),它描述了触发事件的级别。

因此初始更新的深度为1。 当插件导致另一次更新时,插件再次运行,这次深度为2。 当插件导致另一次更新时,插件再次运行,这次深度为3。 等等..

因此,为了解决这个问题,您可以检查深度:

if (context.Depth > 1) {
    return; //Exit to prevent looping
}

无限循环机制的进一步更新:默认情况下(我相信它可以在注册表中更改,但不要引用我的内容!)如果CRM在一小时内看到插件/工作流循环8次,抛出异常。显然,使用同步插件,这很快就完成了。使用工作流,可能包含超时和等待',这可能更难诊断。

IMO因此,如果您想要修改插件所处的记录,最好在可能的情况下使用预更新插件。