Plugins Microsoft CRM插件无限循环

Plugins Microsoft CRM插件无限循环,plugins,dynamics-crm-2011,Plugins,Dynamics Crm 2011,恐怕我还有一个问题。我在更新联系人记录时执行了以下代码,但它给了我一个错误,说作业被取消了,因为它包含一个无限循环。有谁能告诉我为什么会这样吗 // //版权c 2013保留所有权利 // // //2013年8月7日下午2:04:26 //实现PostContactUpdate插件。 // //这段代码是由一个工具生成的。 //运行时版本:4.0.30319.1 // 名称空间插件3测试 { 使用制度; 使用System.ServiceModel; 使用Microsoft.Xrm.S

恐怕我还有一个问题。我在更新联系人记录时执行了以下代码,但它给了我一个错误,说作业被取消了,因为它包含一个无限循环。有谁能告诉我为什么会这样吗

// //版权c 2013保留所有权利 // // //2013年8月7日下午2:04:26 //实现PostContactUpdate插件。 // //这段代码是由一个工具生成的。 //运行时版本:4.0.30319.1 // 名称空间插件3测试 { 使用制度; 使用System.ServiceModel; 使用Microsoft.Xrm.Sdk; 使用Microsoft.Xrm.Sdk.Query; /// ///PostContactUpdate插件。 ///更新以下属性时激发: ///所有属性 /// 公共类PostContactUpdate:插件 { /// ///初始化类的新实例。 /// 公共联系更新 :basetypeofPostContactUpdate { base.RegisteredEvents.Addnew Tuple40,Update,contact,new ActionExecutePostContactUpdate; //注意:如果此插件不是特定于单个实体和消息组合,则可以在此处注册更多事件。 //您可能还需要更新RegisterFile.crmregister插件注册文件以反映任何更改。 } /// ///执行插件。 /// ///包含 /// , /// ///及 /// /// ///为了提高性能,Microsoft Dynamics CRM缓存插件实例。 ///插件的Execute方法应该写为无状态的构造函数 ///不是每次调用插件都调用。此外,多个系统线程 ///无法同时执行插件。所有每次调用的状态信息 ///存储在上下文中。这意味着您不应该在插件中使用全局变量。 /// 受保护的void executePostContactUpdateLocalPluginText localContext { 如果localContext==null { 抛出新ArgumentNullExceptionlocalContext; } //TODO:实现自定义插件业务逻辑。 //从服务提供程序获取执行上下文。 IPluginExecutionContext context=localContext.PluginExecutionContext; IOOrganizationService=localContext.OrganizationService; IServiceProvider serviceProvider=localContext.serviceProvider; ITracingService tracingService=localContext.tracingService; //从输入参数中获取目标实体。 //实体contextEntity=Entitycontext.InputParameters[Target]; 实体targetEntity=null; targetEntity=Entitycontext.InputParameters[Target]; Guid cid=targetEntity.Id; ColumnSet cols=新ColumnSetjobtitle; 实体联系人=service.Retrievecontact、cid、cols; contact.Attributes[jobtitle]=Sometitle; service.Updatecontact; } } }
这是因为当一个联系人被更新时,插件被执行,代码的最后一行再次更新联系人,这导致再次调用插件

然后你就有了无限循环

可以使用IExecutionContext.Depth属性防止循环


但是,如果您解释了您的需求,我认为有可能找到解决方案。

这是因为您的插件是在联系人更新时执行的,并且代码的最后一行再次更新联系人,这会导致再次调用插件

然后你就有了无限循环

可以使用IExecutionContext.Depth属性防止循环


但是,如果您解释您的需求,我认为有可能找到解决方案。

首先如果IExecutionContext.Depth首先如果IExecutionContext.Depth**我经历了很多尝试和错误。我不知道为什么插件上下文不起作用,但是这个可以,但是parentcontext可以。这个变通办法?作品: **

如果this.Context.ParentContext!=null&&this.Context.ParentContext.ParentContext!=无效的 { var assemblyName=Assembly.getExecutionGassembly.GetName.Name; 如果!this.Context.ParentContext.ParentContext.SharedVariables.containsSemblyName { this.Context.ParentContext.ParentContext.SharedVariables.AddassemblyName,true.ToString; } 其他的 { //isRecursive=true; 回来 }
} **我经历了很多尝试和错误。我不知道为什么插件上下文不起作用,但是这个可以,但是parentcontext可以。这个变通办法?作品: **

如果this.Context.ParentContext!=null&&this.Context.ParentContext.ParentContext!=无效的 { var assemblyName=Assembly.getExecutionGassembly.GetName.Name; 如果!this.Context.ParentContext.ParentContext.SharedVariables.containsSemblyName { this.Context.ParentContext.ParentContext.SharedVariables.AddassemblyName,true.ToString; } 其他的 { //isRecursive=true; 回来 }
} 您的插件正在更新jobtitle字段,我不确定此插件是否由所有联系人更新触发,或者您在Registerfile.crmregister插件的定义中为其设置了一些FilteringAttribute。通过从触发此插件的属性中排除jobtitle字段,您可以解决您的问题。

您的插件正在更新jobtitle字段,我不确定是否所有联系人更新都触发了此插件,或者您在Registerfile.crmregister插件的定义中为其设置了一些FilteringAttribute。通过从触发此插件的属性中排除jobtitle字段,您可以解决您的问题。

谢谢!我可以说只有在执行时才执行代码吗?谢谢!我可以说只有在执行的时候才执行代码。深度谢谢Daryl!在我之前发布的代码中,我将把公共静态只读行放在哪里?在这之后:公共类PostContactUpdate:Plugin{和PostContactUpdate构造函数的正上方。谢谢Daryl!在我之前发布的代码中,我将把公共静态只读行放在哪里?在这之后:公共类PostContactUpdate:Plugin{位于PostContactUpdate构造函数的正上方。
public static readonly Guid HasRunKey = new Guid("{6339dc20-01ce-4f2f-b4a1-0a1285b65bff}");
if(context.SharedVariables.ContainsKey[HasRunKey]){
    return;
}else{
    context.SharedVariables.Add(HasRunKey);
    // Proceed with plugin execution
}