2013-11-28 2 views
1

Я хочу создать подключаемый модуль, в котором будет создана запись, основанная на конкретном формате, который можно найти в теле письма. Например:C# - CRM 2011 Создайте запись, когда получено электронное письмо

PO/Dustine/Tolete/8: 45 PM/Sample Расположение/образец убывание

До сих пор, у меня есть этот код:

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 для получения идентификатора электронной почты. Я предполагаю, что ваш плагин зарегистрирован в событии создания сообщения. Убедитесь, что шаг действительно зарегистрирован должным образом (т. Е. Работает в событии post) и что на элементе электронной почты нет другого подключаемого модуля.

Если у вас есть другие плагины, работающие на электронную почту (например, как предварительно событий плагин), вы должны обернуть ваш код с соответствующим условием обеспечения этого только пробегов на пост создать событие т.е.

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

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

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

в качестве примечания, вы определили AddNewServiceRequest как статические. плагины кэшируются CRM, поэтому они в какой-то мере статичны. Вам не нужно объявлять статический член в вашем коде, если вы не собираетесь делиться данными между плагинами или при объявлении статических элементов внутри объектов.

И, наконец, включить трассировку платформы или отладки, чтобы получить представление о том, что действительно вызывает это.

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