viernes, 17 de diciembre de 2010

Consumir servicios externos desde código SandBoxed (y II)

Hace unos días, en este artículo empecé a hablaros de la posibilidad de realizar una llamada a un servicio externo publicado en Azure desde CRM 2011 Online, pero dejé de lado la parte relativa a CRM, quedándome básicamente en una introducción a la tecnología que iba a utilizar. Tal y como os prometí, aquí viene la segunda parte del asunto o, lo que es lo mismo, todo lo concerniente a CRM.

Lo primero que váis a tener que hacer es descargar la SDK de CRM 2011 que podéis encontrar aquí. Ahí encontraréis algunos ensamblados y algunas utilidades que necesitáis para realizar con éxito el proceso que se explica en este artículo. Tal y como avancé en la primera parte, necesitamos hacer un plugin que se lance según las condiciones que nos convengan y, antes de entrar en estas condiciones, vamos a desarrollar la pieza que necesitamos. Para ello, creamos una librería de clases y añadimos una referencia al ensamblado Microsoft.Crm.Sdk.Proxy que encontraremos en la carpeta \sdk\bin del SDK descargado previamente. Tal y como apareció en el artículo anterior, también necesitaré referencias a los ensamblados Microsoft.Http y Microsoft.Http.Extensions. A continuación creamos una clase y escribimos el siguiente código y generamos el ensamblado:

namespace Crm2011Plugins
{
    using System;
    using Microsoft.Http;
    using Microsoft.Xrm.Sdk;
 
    public class ExternalCallPlugin : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            string uri = "http://myapp.cloudapp.net/Service1.svc/";
 
            using (HttpResponseMessage response = new HttpClient().Get(uri))
            {
                // TODO: tratar la respuesta aquí
            }
        }
    }
}

Como véis, tenemos que implementar la interfaz IPlugin y su método Execute. Es ahí dónde haremos la llamada a nuestro servicio externo pero, ¿cómo hago ahora para que CRM 2011 Online ejecute ese método cuando a mí me convenga? Bien, vamos a pensar, por ejemplo, que queremos que se ejecute siempre que alguien modifique el estado de un caso.

Lo primero que tenemos que hacer es buscar en la carpeta \sdk\tools\pluginregistration de la SDK una solución de Visual Studio que tendremos que abrir y compilar para generar la herramienta necesaria para registrar plugins de CRM. Una vez generado tendremos un ejecutable llamado PluginRegistration en la carpeta \sdk\tools\pluginregistration\bin\Debug que deberemos ejecutar. Si proporcionamos a la herramienta los datos de conexión de nuestra instancia de CRM 2011 Online:

  • Nombre para la conexión: cualquiera que os ayude a identificar esa conexión entre otras.
  • Discovery URL: aquella que os corresponda según este artículo.
  • Username: un nombre de usuario con permiso en la instancia de CRM 2011.

Una vez conectados veremos una pantalla similar a la siguiente:

image

A continuación, del desplegable Register seleccionamos la opción Register New Assembly tal y como muestra la figura.

image

Nos aparecerá un formulario como el siguiente, en el cual deberemos especificar la ruta del ensamblado que hemos generado previamente y, como estamos desplegando para CRM 2011 Online seleccionamos las opciones SandBox y Database. Dejadme poner aquí un disclaimer: no me considero un experto en CRM 2011 –y ni siquiera me considero un desarrollador avanzado- así que estas selecciones pueden ser o no la mejor opción.

image

Una vez aceptado el formulario aparecerá un nuevo ensamblado en la lista. Lo seleccionamos con el botón derecho y seleccionamos la opción Register new Step tal y como muestra la figura.

image

Una vez hecho esto aparecerá una pantalla como la de la imagen y deberás rellenar los datos que te pide según tus necesidades.

image

En este caso, las decisiones que hemos tomado han sido las siguientes:

  • Message: esto es la acción que originará el lanzamiento del método Execute. Seleccionamos Update.
  • Primary Entity: nombre de la entidad sobre la cual queremos monitorizar cambios. Seleccionamos incident que es el nombre interno para la entidad Caso.
  • Filtering Attributes: campos sobre los cuales, si se produce un cambio, se lanzará el método Execute. Seleccionamos status code.

Además de esto, podemos elegir si el método se llamará de manera síncrona o asíncrona y si se ejecutará antes de validar el formulario del caso, antes de ejecutar la actualización o después de ejecutar la actualización. En nuestro caso seleccionamos Post-operation y Synchronous. Finalmente, pulsamos el botón Register New Step.

Una vez hecho esto, ya deberíamos observar como, cada vez que modificamos el estado de un caso en el sistema se produce una llamada al método externo que tenemos publicado en Azure.

1 comentarios:

Alexis dijo...

Muy buenas! por fin encuentro algo de información sobre esto...la verdad que los dos post te han quedado genial, pero te ha faltado(a mi parecer) la puntita de como tratar la respuesta, para los que como yo estamos empezando con el tema :). De todas formas, me ha resultado muy muy util, muchas gracias y un saludo!