2013-11-23 61 views
0

我已經爲PreImage更新創建了一個插件。當實體發生變化時,插件將會啓動。無法在CRM 2011中的更新插件中保存更改

在插件中,我調用了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); 
        } 
       } 
      } 
     } 

我該如何解決這個問題?

回答

1

原因你得到它引用一個無限循環的錯誤:

插件被登記在更新,和它本身更新記錄。這意味着插件有效地自行調用。

CRM具有無限循環檢測機制,如果觸發,將引發異常停止插件(或工作流)運行。這是一個有用的工具 - 如果沒有它,上面的插件將永遠循環,或者更確切地說,直到它迫使你的服務器崩潰。

插件上下文中稱爲「深度」的字段可告訴您有關循環的信息。它是一個int值(默認值爲1),它描述事件觸發的級別。

因此,最初的更新將有1 深度當插件會導致另一個更新,插件再次運行和這一次的深度是2 當插件會導致另一個更新,插件再次運行這個時候深度爲3 等等..

因此,要解決這個問題,你可以檢查的深度:

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

在無限循環機制的進一步升級:在默認情況下(我相信它可以在註冊表中更改,但不要在此引用我的意見!)如果CRM看到插件在一小時內進入/工作流程循環八次,引發異常。顯然,使用同步插件可以很快完成。使用一個工作流,可能包含超時並等待,這可能更難以診斷。

IMO因此,如果您想要修改插件的行爲記錄,那麼在可能的情況下,更新插件是可取的。

+0

不要盲目使用深度:http://stackoverflow.com/a/18110030/227436 – Daryl

+0

絕對 - 一如既往;買家當心:) – glosrob

相關問題