Microsoft CRM插件无限循环 [英] Microsoft CRM Plugin Infinite Loop

查看:107
本文介绍了Microsoft CRM插件无限循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Another MS CRM question from me, I'm afraid. I've got the following code being executed on the update of a contact record but it gives me an error saying the job was cancelled because it includes an infinite loop. Can anyone tell me why this is happening, please?

// <copyright file="PostContactUpdate.cs" company="">
// Copyright (c) 2013 All Rights Reserved
// </copyright>
// <author></author>
// <date>8/7/2013 2:04:26 PM</date>
// <summary>Implements the PostContactUpdate Plugin.</summary>
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.1
// </auto-generated>
namespace Plugins3Test
{
    using System;
    using System.ServiceModel;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Query;

    /// <summary>
    /// PostContactUpdate Plugin.
    /// Fires when the following attributes are updated:
    /// All Attributes
    /// </summary>    
    public class PostContactUpdate: Plugin
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="PostContactUpdate"/> class.
        /// </summary>
        public PostContactUpdate()
            : base(typeof(PostContactUpdate))
        {
            base.RegisteredEvents.Add(new Tuple<int, string, string, Action<LocalPluginContext>>(40, "Update", "contact", new Action<LocalPluginContext>(ExecutePostContactUpdate)));

            // Note : you can register for more events here if this plugin is not specific to an individual entity and message combination.
            // You may also need to update your RegisterFile.crmregister plug-in registration file to reflect any change.
        }

        /// <summary>
        /// Executes the plug-in.
        /// </summary>
        /// <param name="localContext">The <see cref="LocalPluginContext"/> which contains the
        /// <see cref="IPluginExecutionContext"/>,
        /// <see cref="IOrganizationService"/>
        /// and <see cref="ITracingService"/>
        /// </param>
        /// <remarks>
        /// For improved performance, Microsoft Dynamics CRM caches plug-in instances.
        /// The plug-in's Execute method should be written to be stateless as the constructor
        /// is not called for every invocation of the plug-in. Also, multiple system threads
        /// could execute the plug-in at the same time. All per invocation state information
        /// is stored in the context. This means that you should not use global variables in plug-ins.
        /// </remarks>
        protected void ExecutePostContactUpdate(LocalPluginContext localContext)
        {
            if (localContext == null)
            {
                throw new ArgumentNullException("localContext");
            }

            // TODO: Implement your custom Plug-in business logic.

            // Obtain the execution context from the service provider.
            IPluginExecutionContext context = localContext.PluginExecutionContext;
            IOrganizationService service = localContext.OrganizationService;
            IServiceProvider serviceProvider = localContext.ServiceProvider;
            ITracingService tracingService = localContext.TracingService;


            // Obtain the target entity from the input parmameters.
            //Entity contextEntity = (Entity)context.InputParameters["Target"];




                Entity targetEntity = null;
                targetEntity = (Entity)context.InputParameters["Target"];
                Guid cid = targetEntity.Id;
                ColumnSet cols = new ColumnSet("jobtitle");

                Entity contact = service.Retrieve("contact", cid, cols);
                contact.Attributes["jobtitle"] = "Sometitle";
                service.Update(contact);





        }
    }
}

推荐答案

之所以发生这种情况,是因为在更新联系人时执行了您的插件,并且代码的最后一行再次更新了联系人,这导致再次调用该插件..

it's happening because your plugin is executed when a contact is updated and the last line of your code update the contact again, this cause to call again the plugin ...

然后您将遇到无限循环

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

You can prevent the loop using the IExecutionContext.Depth property

http://msdn.microsoft. com/en-us/library/microsoft.xrm.sdk.iexecutioncontext.depth.aspx

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

However if you explain your requirement I think it's possible to find a solution.

这篇关于Microsoft CRM插件无限循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆