2013-11-28 44 views
1

我想創建一個插件,根據電子郵件正文中可找到的特定格式創建一個記錄。例如:c# - CRM 2011收到電子郵件時創建記錄

PO/Dustine/Tolete/8:45 PM /樣本定位/樣品遞減

到目前爲止,我有這樣的代碼:

using System; 
using System.Diagnostics; 
using System.Linq; 
using System.ServiceModel; 
using Microsoft.Xrm.Sdk; 
using Xrm; 

public class Plugin : IPlugin 
{ 
    public void Execute(IServiceProvider serviceProvider) 
    { 
     IPluginExecutionContext context = (IPluginExecutionContext) 
     serviceProvider.GetService(typeof(IPluginExecutionContext)); 

     Entity entity; 

     // Check if the input parameters property bag contains a target 
     // of the create operation and that target is of type Entity. 
     if (context.InputParameters.Contains("Target") && 
     context.InputParameters["Target"] is Entity) 
     { 
      // Obtain the target business entity from the input parameters. 
      entity = (Entity)context.InputParameters["Target"]; 

      // Verify that the entity represents a contact. 
      if (entity.LogicalName != "email") { return; } 
     } 
     else 
     { 
      return; 
     } 

     try 
     { 
      IOrganizationServiceFactory serviceFactory = 
       (IOrganizationServiceFactory)serviceProvider.GetService(
      typeof(IOrganizationServiceFactory)); 
      IOrganizationService service = 
      serviceFactory.CreateOrganizationService(context.UserId); 

      var id = (Guid)context.OutputParameters["id"]; 

      AddNewServiceRequest(service, id); 
     } 
     catch (FaultException<OrganizationServiceFault> ex) 
     { 
      throw new InvalidPluginExecutionException(
      "An error occurred in the plug-in.", ex); 
     } 
    } 

    private static void AddNewServiceRequest(IOrganizationService service, Guid id) 
    { 
     using (var crm = new XrmServiceContext(service)) 
     { 

      var email = crm.EmailSet.Where(c => c.ActivityId == id).First(); 

      string[] noteText = email.Description.ToString().Split('/'); 

      foreach(string text in noteText){ 

       Console.WriteLine(text); 
      } 

      Entity peaceAndOrder = new Entity("msa_noisecomplaintrequest"); 

      peaceAndOrder["msa_firstname"] = noteText[1]; 
      peaceAndOrder["msa_lastname"] = noteText[2]; 
      peaceAndOrder["msa_incidenttime"] = noteText[3]; 
      peaceAndOrder["msa_location"] = noteText[4]; 
      peaceAndOrder["msa_description"] = noteText[5]; 

      service.Create(peaceAndOrder); 
     } 
    } 
} 

但每次事件被觸發時,一錯誤正在發生。我究竟做錯了什麼?

+0

也許你可以給我們一個關於錯誤的提示? –

+0

它只是說我在Outlook上跟蹤它時發生錯誤。 –

+0

嘗試打開跟蹤並收集錯誤。 – Piyush

回答

1

您正在使用context.OutputParameters獲取電子郵件ID。我假設你的插件是在post創建事件中註冊的。 確保步驟確實正確註冊(即在後置事件上運行),並且電子郵件實體上沒有其他插件正在運行。

如果你有電子郵件運行的其他插件(如預事件插件),你必須以適當的條件下包裝你的代碼,確保這隻在後,即創建事件運行

if (context.Stage == 40 /*Post Operation*/) 
{ 
    // Your code here … 
} 

這也是符合條件檢查正確的消息名稱來包裝你的代碼,即

if (context.MessageName == "CREATE") 
{ 
    // Your code here … 
} 

作爲一個側面說明好的做法,你定義AddNewServiceRequest爲靜態的。插件由CRM緩存,因此它們在某種意義上是靜態的。除非要在插件之間共享數據或在對象中聲明靜態成員,否則不需要在代碼中聲明靜態成員 。

最後,啓用平臺跟蹤或調試來了解真正導致此問題的原因。

相關問題