2013-11-28 33 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缓存,因此它们在某种意义上是静态的。除非要在插件之间共享数据或在对象中声明静态成员,否则不需要在代码中声明静态成员 。

最后,启用平台跟踪或调试来了解真正导致此问题的原因。

相关问题