viernes, 6 de noviembre de 2009

Dejando rastro de los plugins

Muchas veces necesitamos hacer pruebas y depuraciones para ver como llegan los datos en un plugin, en especial en relacion con los input/output parameters y las imágenes.
Bueno, he preparado un plugin, que registra en una entidad de CRM, lo que ocurre cuando se dispara el plugin y nos deja el XML de esos parametros que "pasan" por el plugin.
Para esto los pasos son:
1) hacer un plugin con el siguiente código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace Logger
{

public class Log : IPlugin
{
public void Execute(IPluginExecutionContext context)
{

string sInputParameters = serializar(context.InputParameters);
string sOutputParameters = serializar(context.OutputParameters);
string sPreEntityImages = serializar(context.PreEntityImages);
string sPostEntityImages = serializar(context.PostEntityImages);

StringProperty strname = new StringProperty("new_name", context.PrimaryEntityName);
StringProperty strmensaje = new StringProperty("new_mensaje", context.MessageName);
StringProperty strinputparameter = new StringProperty("new_inputparameter", sInputParameters);
StringProperty stroutputparameter = new StringProperty("new_outputparameter", sOutputParameters);

StringProperty strpreimages = new StringProperty("new_preentityimages", sPreEntityImages);
StringProperty strpostimages = new StringProperty("new_postentityimages", sPostEntityImages);

DynamicEntity dyn = new DynamicEntity();
dyn.Name = "new_log";
dyn.Properties.Add(strname);
dyn.Properties.Add(strmensaje);
dyn.Properties.Add(strinputparameter);
dyn.Properties.Add(stroutputparameter);
dyn.Properties.Add(strpreimages);
dyn.Properties.Add(strpostimages);

ICrmService serv=context.CreateCrmService(true);
serv.Create(dyn);
}

public string serializar(PropertyBag obj)
{
string sreturn = "";
XmlSerializer serializer = new XmlSerializer(typeof(PropertyBag));
if (obj != null)
{
using (MemoryStream xmlInputParameters = new MemoryStream())
{
serializer.Serialize(xmlInputParameters, obj);
byte[] buffer = new Byte[xmlInputParameters.Length];
xmlInputParameters.Seek(0, 0);
xmlInputParameters.Read(buffer, 0, Convert.ToInt32(xmlInputParameters.Length));
sreturn = System.Text.Encoding.ASCII.GetString(buffer, 0, Convert.ToInt32(xmlInputParameters.Length));
}
}
if (sreturn.Length > 100000) //el crm no deja campos ntext mas grandes de 100.000 caracteres
{
sreturn = sreturn.Substring(0, 100000);
}
return sreturn;
}
}
}
El código como ven es bastante sencillo, lo único que hace es serializar los objetos a mostrar, y crear un registro de "Log" con la información.

2) Importar las personalizaciones de la entidad donde se registrarán los datos. Descargar la misma desde aquí. (es una sola entidad, con el nombre "Log")

3) Registrar la dll y añadirla al mensaje que deseamos "depurar" (se debe registrar en tantos eventos como deseemos):


Los datos se irán registrando de la siguiente forma (nos deja quien diparó el evento, la entidad, el tipo, la hora y los parametros e imágenes):


Los recursos para esto pueden ser descargados desde aquí:
  • Personalizaciones entidad Log

  • Fichero Dll


  • Espero pueda servirles en su vida con los "plugins".

    un abrazo

    No hay comentarios:

    Publicar un comentario