Sunday 21 August 2011

Tutoriel sur Microsoft Dynamic CRM 4.0 SDK - Partie 1- French Version

Microsoft Dynamic CRM (MSDCRM) est un outil de gestion des relations clients, de ventes et de marketing, ce sont entre autre ses fonctionnalités primaires. Celles-ci pourront être étendues par la suite et paramètrées pour répondre au besoin de la société.
Dans cette article, je me concentrerais surtout dans l'aspect programmation à travers le SDK fourni par Microsoft qui va permettre de communiquer sur le serveur CRM via les APIs.
Cet aspect s'oriente surtout sur la communication vers la base de données SQL server de l'application car toutes les données qui sont sur le MSDCRM sont stockées dans des tables métiers ou système.

A la base, MSDCRM expose 3 web services, dans la version 4.0, ce sont des webservices de type asmx qui sont exposés par le système.

Ainsi nous avons, 2 webservices  exposés de manière explicite (  via la page de configuration ) :
- CrmService.asmx : expose des méthodes pour communiquer avec les entités métiers.
- MetadataService.asmx : expose des méthodes agissant sur les métadonnées.

En enfin, le 3ème, exposé de maniere implicite :
- DiscoveryService.asmx : qui va permettre d'interroger le serveur pour récuperer entre autre, les FQDN des 2 autres webservices précedents.


Comment fonctionne le DiscoveryService.asmx ?

Ce service est exposé via l'URL : http://SERVER/MSCrmServices/2007/ad/crmdiscoveryservice.asmx



Ce bout de code montre le fonctionnement de ce webservice :

CrmDiscoveryService discoveryService = new CrmDiscoveryService();
discoveryService.UseDefaultCredentials = true;
discoveryService.Url = "http://
SERVER/MSCrmServices/2007/ad/crmdiscoveryservice.asmx";
RetrieveOrganizationsRequest orgRequest = new RetrieveOrganizationsRequest();
RetrieveOrganizationsResponse orgResponse = (RetrieveOrganizationsResponse)discoveryService.Execute(orgRequest);
OrganizationDetail orgInfo = null;
foreach (var item in orgResponse.OrganizationDetails)
{
          if(item.OrganizationName == "DEVENVA")
                {   
                  orgInfo = item;
                  break;               
                }
}
Comme vous le voyez, le SDK a une forme de type messagecontract en WCF, un objet de type Request est passé en paramètre et un objet de type Response est retourné par la méthode Execute de l'objet discoveryService qui est une instance de la référence au webservice. Lors de l'appel à cette méthode, le serveur fait une recherche lookup, ce qui lui permet d'interroger toutes les organisations déclarées sur le serveur CRM.
Plus particulièrement, je ne désire que travailler sur l'organisation DEVENVA, ce qui justifie le filtrage item.OrganizationName == "DEVENVA", l'objet orgInfo contiendra alors des infos relatives à cette organisation.
En particulier, les champs CrmServiceUrl et CrmMetadataServiceUrl contiendront les URL des 2 webservices
CrmService.asmx et MetadataService.asmx respectivement.

CrmService.asmx

Comme évoqué précedemment, ce webservice expose des méthodes qui permettent de communiquer avec les entités métiers via les protocoles http, https. Nous verrons plus bas qu'il y a aussi un moyen de communiquer avec ces même entités via un objet de type "DataContext" qui permettra de manipuler des styles de programmation semblables à Linq to SQL.
TODO : Pour pouvoir utiliser le webservice, vous devez ajouter une réference web sur votre visual studio.
Attention : Sur visual studio 2008/2010, il faut faire un "Add Service Reference" puis  cliquer sur "Advanced" et enfin sur "Add Web Reference" dans la partie Compatibilité. Ceci parce que le service sous la version Dynamic CRM 4.0 est encore sous l'ancienne forme .NET 2.0.


Le code ci-dessous permet d'insérer un nouvel enregistrement dans l'entité Account. Après l'exécution, une nouvelle ligne devra s'ajouter sur la liste de Account.



//Il est necessaire de creer un token pour authentifier le client aupres du serveur, ici CrmServiceApp est le //nom de ma solution pour ce tutoriel et CrmServiceClient le nom que j'ai donné à mon web reference
CrmServiceApp.CrmServiceClient.CrmAuthenticationToken token = new CrmServiceApp.CrmServiceClient.CrmAuthenticationToken();
token.AuthenticationType = 0; //correspond a une auth type "Integrated Security"
token.OrganizationName = "DEVENVA";


//Ici, j'ai directement preciser l'URL du crmService, nous avons vu que nous avons pu
//utiliser le webservice discovery pour le recuperer. Dans mon cas, je connais directement l'URL
//Une bonne pratique consiste à mettre l'URL dans le fichier de config/
CrmServiceApp.CrmServiceClient.CrmService crmService = new CrmServiceApp.CrmServiceClient.CrmService();
crmService.Url = "http://SERVER/MSCrmServices/2007/CrmService.asmx";
crmService.CrmAuthenticationTokenValue = token;
crmService.Credentials = System.Net.CredentialCache.DefaultCredentials;


//Crée un objet de type account qui représente un Account , puis assigne quelques propriétés
CrmServiceApp.CrmServiceClient.
account nv = new CrmServiceApp.CrmServiceClient.account();
nv.name = "NOM_FICTIF";
Guid eoleId = crmService.Create(nv);



Après cette commande, un nouvel enregistrement sera créé dans la liste des Accounts

Comme vous le voyez, c'est l'objet crmService qui sert de proxy pour communiquer avec le service.
La méthode Create fait partie de la liste des méthodes disponibles. Son nom est intuitif sur la fonctionnalité proposée.


 La deuxième facon pour communiquer avec le serveur CRM est de passer par les classes de mappage pour traiter les entités comme dans un outil ORM.
Cette 2eme possibilité ressemble exactement à la connexion et manipulation en Linq to SQL :
a) déclaration d'une chaine de connexion dans le fichier de configuration
b) Creation d'un objet context
c) Invocation d'une entité cible
d) Application des méthodes de l'objet context pour persister les changements.

Nous verrons ce deuxième point dans la 2eme partie du tutoriel. 

Si cette article vous  a été bénéfique, merci de cliquer un lien de pub ( seulement un, deux c'est mieux). A bientot

No comments:

Post a Comment