Estos callout se utilizan siempre y cuando nosotros tenemos que hacer una validación o cualquier otra cosa antes o después de Actualizar, Crear, Cambiar de estado o etc. alguna entidad. Cuando hablo de entidad lo podemos entender asi… cuando quiero modificar una tarea la entidad afectada es la de Task y en ella configuro todo lo que necesito … mmm mucho bla bla bla y en realidad nada de acción, estoy poniendo un ejemplo súper básico de cómo hacer y como configurar un callout .
Personalmente al hacer los callout he tenido muchos problemas porque no encontraba esta dll “Microsoft.Crm.Platform.Callout.Base.dll” pero una vez importada en mi proyecto y en
1. Debo de importar using Microsoft.Crm.Callout;
2. Debo de buscar el evento indicado
Cuando colocamos public override nos va a salir todos los eventos
Escogemos la indicada y le damos TAB automáticamente el evento se arma.
3. Como yo escogi
public override void PostUpdate(CalloutUserContext userContext,CalloutEntityContext entityContext, string preImageEntityXml, string postImageEntityXml)
{}
Tengo los siguientes parámetros de entrada. (Muestro solo los utilice en el ejemplo )
userContext = ID del Usuario que se conecta y BizUnitId id de la unidad de negocio del usuario conectado.
- preImageEntityXml = XML de la entidad que esta siendo afectada antes de la modificación
- postImageEntityXml = XML de la entidad que esta siendo afectada luego de hacer la modificación
Estos dos campos son muy útiles cuando queremos hacer auditoria ya que la primera de estos me envía el XML con todos los campos que tienen antes de grabar y la segunda me envía un XML con todos los campos que tiene el formulario actualmente y que están siendo enviados para actualizar. Estos parámetros lo configuramos en el callout.config que lo vamos a ver más adelante.
4. Configuramos nuestro Servicio CRM
public static CrmService servicoWeb(Guid gUsuario)
{
CrmService oService = new CrmService();
string sUrlCompletoMetadata = string.Empty;
try
{
RegistryKey oKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\MSCRM");
string sCrmUrl = Convert.ToString(oKey.GetValue("ServerUrl"));
sUrlCompleto = sCrmUrl + (sCrmUrl.EndsWith("/")?"":"/") + "2006/crmservice.asmx";
oService.Url = sUrlCompleto;
oService.Credentials = System.Net.CredentialCache.DefaultCredentials;
oService.PreAuthenticate = true;
oService.UnsafeAuthenticatedConnectionSharing = true;
oService.CallerIdValue = new CallerId();
oService.CallerIdValue.CallerGuid = gUsuario;
}
catch(System.Web.Services.Protocols.SoapException ex)
{
Util.WriteToFile(ex.Detail.InnerText.ToString());
}
return oService;
}
5. Creamos nuestro log para ver si hay errores… según lo que e ledio en muchos post estos lo hacen en el visor de eventos… digamos que yo prefiero un archivo de texto simple porque tengo mayor control en el :D .
public static void WriteToFile(string message)
{
String sNombreArchivo = @"C:\callout_test_output.txt";
if (!File.Exists(sNombreArchivo))
File.Create(sNombreArchivo);
using (StreamWriter sw = new StreamWriter(sNombreArchivo, true))
{
sw.WriteLine(message);
}
}
public override void PostUpdate(CalloutUserContext userContext,
CalloutEntityContext entityContext,
string preImageEntityXml,
string postImageEntityXml)
{
Util.WriteToFile(postImageEntityXml.ToString());
//Escribo el xml de la entidad una ves ya actualiza
CrmService oServices = servicoWeb(userContext.UserId);
//Creo el objeto del web Services
//Comenzando a leer el XML
XmlDocument xmlDocumento = new XmlDocument();
xmlDocumento.LoadXml(postImageEntityXml);
XmlNodeList xmlListadeNodos = xmlDocumento.GetElementsByTagName("Property");
foreach(XmlElement oElementos in xmlListadeNodos)
{
if(oElementos.GetAttribute("Name").ToString() == "activityid")
{
sGuidActividad = oElementos.GetElementsByTagName("Value")[0].InnerXml.ToString();
Util.WriteToFile("sGuidActividad " + sGuidActividad);
}
}
//Una vez que ya tenga el ID de la actividad lo estoy ingresando a una base de datos esto lo hago para que vean que se puede hacer de todo en el callout. :D, incluso puedo hacer búsquedas, crear casos , tareas etc.
System.Data.SqlClient.SqlConnection sqlCon = new System.Data.SqlClient.SqlConnection("Data Source=;Initial Catalog=;Integrated Security=SSPI;uid=sa;pwd=pass@word1");
stbQuery.Append("INSERT INTO [dbo].[ACTIVIDADES] ([ID_ACT_N1]")
.Append(") VALUES ('")
.Append(sGuidActividad.Replace("{","").Replace("}","")).Append("','");
Util.WriteToFile(stbQuery.ToString());
System.Data.SqlClient.SqlCommand sqlCom = new System.Data.SqlClient.SqlCommand(stbQuery.ToString(),sqlCon);
sqlCom.Connection.Open();
sqlCom.ExecuteNonQuery();
sqlCom.Connection.Close();
}
7. Configurando el callout.config.xml
Este archivo define que evento y la clase que debe de ser ejecutada en una entidad por ejemplo.
< version="3.0">
< entity="account" event="PreUpdate">
< / callout >
< entity="task" event="PostUpdate">
< assembly="Microsoft.1to1.CallOutPeru.dll">
<>@all< / postvalue >
< /subscription >
< /callout >
< entity="task" event="PostSetState">
< assembly Microsoft.1to1.CallOutPeru.dll">
<> @all< /postvalue >
< / subscription >
< /callout >
< /callout.config >
En este callout.config.xml estoy configurando 2 entidades diferentes con diferentes llamada de clases Las partes del xml son las siguientes.
- <> Esto se coloca por cada entidad que yo quiere hacer mis llamadas
o entity=" " enttidad que va a ser afectada por el callout
o event=" " evento disparador - <> Por cada dll que tenamos en un entidad
o Assembly nombre de la dll
o class se pone lo siguiente <>.
o <> o <> parámetros que va a enviar al callout si coloco @ all me envía todos los parámetros de la entidad.
- Debemos de copiar
- dll creada
- dll llamada “Microsoft.Crm.Platform.Callout.Base.dll”
- callout.config.xml
a la siguente ruta “
OJO : Antes y después de copiar las dll lo que debemos de hacer es ir a inicio/ejecutar/iisreset después de todo eso no tendremos problemas de ejecutar el callout.
Bueno como siempre si necesitan mas ayuda no duden en poner sus comentarios , quejas , sugerencias , etc …
Saludos
Atilin
PD : Todos estos datos, lo pueden ubicar en el SDK








1 comentarios