我已经使用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);
}
}
}
}
如何解决此问题?
答案 0 :(得分:1)
我在谷歌搜索后发现了这个问题。我在后期操作中注册了更新步骤。我必须在预先操作中注册。
无需service.Update(smsentity);
。
答案 1 :(得分:1)
您收到引用无限循环的错误的原因:
插件在更新时注册,并自行更新记录。这意味着该插件可以有效地调用自己。
CRM具有无限循环检测机制,如果触发,将抛出异常以阻止插件(或工作流)运行。这是一个有用的工具 - 没有它,上面的插件将永远循环,或者更确切地说,直到它迫使你的服务器倒下。
插件上下文中的一个字段,称为“深度”,可以告诉您循环。它是一个int值(默认值为1),它描述了触发事件的级别。
因此初始更新的深度为1。 当插件导致另一次更新时,插件再次运行,这次深度为2。 当插件导致另一次更新时,插件再次运行,这次深度为3。 等等..
因此,为了解决这个问题,您可以检查深度:
if (context.Depth > 1) {
return; //Exit to prevent looping
}
无限循环机制的进一步更新:默认情况下(我相信它可以在注册表中更改,但不要引用我的内容!)如果CRM在一小时内看到插件/工作流循环8次,抛出异常。显然,使用同步插件,这很快就完成了。使用工作流,可能包含超时和等待',这可能更难诊断。
IMO因此,如果您想要修改插件所处的记录,最好在可能的情况下使用预更新插件。