2013-11-23 4 views
0

Я создал плагин для обновления с помощью PreImage. Когда что-то изменится в сущности, плагин загорится.Невозможно сохранить изменения в обновлении плагина в CRM 2011

В плагине я вызываю веб-сервис, и я хочу сохранить ответ 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); 
        } 
       } 
      } 
     } 

Как исправить эту проблему?

ответ

1

Я нашел проблему после того, как отправил ее в Google. Я зарегистрировал шаг обновления в операции post. И я должен зарегистрироваться в предварительном режиме.

Нет необходимости делать service.Update(smsentity);.

CRM 2011: Plugin to update fields of current record

1

Причина вы получаете ошибку, которая ссылается на бесконечный цикл:

Плагин зарегистрирован на обновление, и сам обновляет запись. Это означает, что плагин эффективно называет себя.

CRM имеет механизм обнаружения бесконечных циклов и, если он запущен, генерирует исключение, чтобы остановить запуск плагина (или рабочего процесса). Это полезное средство - без него плагин выше будет зацикливаться навсегда или, если быть более точным, до тех пор, пока он не затормозит ваш сервер.

Поле в контексте плагина, которое называется «Глубина», может рассказать вам о зацикливании. Это значение int (по умолчанию 1), и оно описывает, на каком уровне было инициировано событие.

Таким образом, первоначальное обновление будет иметь глубину 1. Когда плагин вызывает еще одно обновление, плагин работает снова и на этот раз глубина 2. Когда плагин вызывает еще одно обновление, плагин работает снова и на этот раз глубина 3. и так далее ..

таким образом, чтобы обойти эту проблему, вы можете проверить глубину:

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

дальнейшее обновление механизма бесконечной петли: по умолчанию (я считаю, что можно быть изменен в реестре, но не цитируйте меня на этом!), если CRM видит плагин in/workflow восемь раз в течение одного часа, генерируется исключение. Очевидно, что с помощью синхронного плагина это делается быстро. С рабочим процессом, который может содержать таймауты и ожидания », и это может быть сложнее диагностировать.

IMO поэтому, если возможно, плагин с предварительным обновлением предпочтительнее, если вы хотите изменить запись, на которой работает плагин.

+0

Будьте осторожны при использовании Глубина слепо: http://stackoverflow.com/a/18110030/227436 – Daryl

+0

Абсолютно - как всегда; Покупатель, будь осторожен :) – glosrob

Смежные вопросы