22/3/11

File - New - Project - Hola CRM 2011

Si habéis entendido el título estáis en el sitio adecuado. Esto es, un ejemplo de código minimalista para conectarse a CRM 2011 a través de la SDK, tanto On-Premise como On-line.

Abrimos Visual Studio 2010 y creamos un proyecto de tipo Consola sobre .NET framework 4.0 (¡Primera vez que los desarrolladores de CRM no vamos un paso por detrás del Framework!).

Añadimos las referencias:

  • System.ServiceModel porque usamos WCF
  • System.Runtime.Serialization serialización estándar de .NET
  • microsoft.xrm.sdk para las clases específicas de CRM (en la carpeta bin de la SDK)

Añadimos los namespaces:

using System;
using System.ServiceModel.Description;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;

namespace HolaCRM2011
{
class Program
{
static void Main(string[] args)
{
}
}
}

La forma de crear un proxy para llamar a los servicios WCF de CRM On Premise es bien sencilla. La clase ServiceConfigurationFactory nos proporciona un método CreateConfiguration que devuelve un objecto de configuración que representa la mitad de la información que necesitamos para conectarnos a CRM: el endpoint de WCF. Esta dirección la podemos recordar navegando a la sección Configuration - Settings - Customizatins - Developer resources


var config = 
ServiceConfigurationFactory.CreateConfiguration<IOrganizationService>(
new Uri("http://localhost:5555/MiOrganizacion"));
var servicio = new OrganizationServiceProxy(config, new ClientCredentials());

Y por último, invocar un método CRUD sobre el servicio. En este caso, el clásico "Crear contacto". La novedad aquí es que ya no tenemos que usar las clases wrapper de CRM sino que podemos tirar directamente con los tipos básicos de .NET. Así, por ejemplo, en lugar de usar un CrmNumber usamos directamente un int.


var contacto = new Entity("contact");
contacto["firstname"] = "Nombre";
contacto["lastname"] = "Apellidos";
contacto["numberofchildren"] = 2;
var id = servicio.Create(contacto);

Si queremos trabajar con CRM Online, la cosa se complica un poco. Afortunadamente para programadores como yo (con facilidad para "abstraernos") toda esa complicación está resuelta en la clase de ayuda CrmConnection que encontramos en la dll microsoft.xrm.client


var connectionString =
@"Url=https://miorg.crm4.dynamics.com;
Username=miliveid@hotmail.com;
DeviceID=MIDEVICEID-aa9f617b2e6d;
DevicePassword=MiDevicePass@word;
Password=MiPass@word";
var connection = CrmConnection.Parse(connectionString);
var servicio = new OrganizationService(connection);

Como se ve, la cadena de conexión tiene la misma pinta que las de ADO.NET de toda la vida e incluye también las credenciales. Lo que daba más guerra en versiones anteriores de la SDK (vamos por la 5.0.2) era registrar el dispositivo(Aquí resuelto con DeviceID y DevicePassword). Este parte de la conexión controla la autenticación basada en claims, que es un tema demasiado vasto y desconocido para mi como para hincarle el diente. La parte buena es que ... funciona. La primera vez que se llama al servicio, si no conoce el dispositivo, lo registra contra Live con el password especificado y obtiene un token. En las siguientes llamadas no necesitará este paso y llama directamente a CRM, aunque como programadores "abstraídos" ni nos enteraremos...


El programa completo quedaría así:


using Microsoft.Xrm.Client;
using Microsoft.Xrm.Client.Services;
using Microsoft.Xrm.Sdk;

namespace HolaCRM2011
{
class Program
{
static void Main(string[] args)
{
var connectionString =
@"Url=https://miorg.crm4.dynamics.com;
Username=miliveid@hotmail.com;
DeviceID=MIDEVICEID-aa9f617b2e6d;
DevicePassword=MiDevicePass@word;
Password=MiPass@word";
var connection = CrmConnection.Parse(connectionString);
var servicio = new OrganizationService(connection);

var contacto = new Entity("contact");
contacto["firstname"] = "Nombre";
contacto["lastname"] = "Apellidos";
contacto["numberofchildren"] = 2;
var id = servicio.Create(contacto);
}
}
}

Sólo hay que cambiar los datos particulares (todos los que empiezan por "Mi") por los de la organización de CRM 2011 online. También se puede escoger un identificador de dispositivo y password de dispositivo propios.

2 comentarios:

Anónimo dijo...

muy interesante, pero me aparece este error.
Could not load file or assembly 'Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.
me podrias ayudar con esto??

Daniel Sabater dijo...

Hola, "Anónimo"

Si es un error que te da en tiempo de ejecución pero no en compilación puede ser que estés utilizando una versión incorrecta de la SDK. ¿La descargaste de aquí? http://tinyurl.com/d4r88qx

Y también: ¿has añadido la referencia al proyecto?

Saludos

Dani

PD: Soy muy fan tuyo, me gustó mucho "El lazarillo de Tormés" :-)