Déployer un service WCF custom sur SharePoint 2010

Récemment j’ai eu à déployer un service WCF custom au sein de SharePoint 2010 via une feature bien comme il faut.
Sous MOSS 2007, intégrer des services WCF n’était pas une chose simple, voir quasi pas viable.
Maintenant c’est une chose tout à fait réalisable assez simplement bien qu’il y ai quelques étapes à respecter pour arriver à nos fins. Dans cet article nous allons voir comment rendre un service WCF disponible en SOAP, avec expositions du wsdl et ceci sans config !

Mon projet de départ contient 2 ClassLibrary : une pour le contrat de service et de donnée, une autre pour l’implémentation du service. Jusque ici rien que du "basique wcf"

image

Je vais donc ajouter un projet SharePoint 2010 à ma solution:

image

Il faut ensuite indiquer l’url du site SharePoint, et ne pas choisir le mode sandboxed solution car nous avons besoins de déployer des fichiers dans le dossier ISAPI de SharePoint.

J’ajoute ensuite au projet un dossier SharePoint mappé sur ce fameux dossier ISAPI. A l’intérieur j’ajoute un dossier portant le nom de mon service, et enfin j’ajoute un fichier svc (fichier texte renommé en svc)

image

Ce fichier svc doit contenir absolument 2 directives :
o    Assembly : pour indiquer quel assembly contient le service
Soit ce sera l’assembly généré par ce projet dans ce cas il faut mettre ça :

<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$"%>

(le mot entouré de $ sera remplacé lors du packaging par Visual Studio à condition de rajouter une option dans le fichier csproj , voir plus loin)

Soit ce sera un autre assembly, comme dans mon cas, je mets donc le nom de l’assembly contenant l’implémentation du service:

<%@ Assembly Name="Bewise.CustomWcfService.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a676059fc5bcf00d"%>

o    ServiceHost : pour indiquer le service à héberger et à démarrer. Ici une nouveauté de SharePoint permet d’utiliser des Factory prêtes à l’emploi (il y en a 3 : SOAP, REST, TCP) pour ne pas à avoir à déclarer un endpoint dans le fichier web.config. C’est là que réside la magie ! Cette factory va créer au runtime le binding et la config qui va bien. Dans l’exemple ci-après je fais du SOAP :

<%@ ServiceHost
        language="C#"
        Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressBasicHttpBindingServiceHostFactory, Microsoft.SharePoint.Client.ServerRuntime, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
        Service="NomCompletDeLaClasseQuiImplementLeServiceContract, $SharePoint.Project.AssemblyFullName$"  %>

Bien sûr il faut remplacer NomCompletDeLaClasseQuiImplementLeServiceContract par le bon nom. Soit encore une fois l’assembly de la solution SharePoint contient l’implémentation de votre service et il faut donc laisser le mot clé entouré de $. Soit comme dans mon cas on met les infos du bon assembly. Voilà ce que ça donne:

<%@ ServiceHost
        language="C#"
        Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressBasicHttpBindingServiceHostFactory, Microsoft.SharePoint.Client.ServerRuntime, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
        Service="Bewise.CustomWcfService.Services.Service1, Bewise.CustomWcfService.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a676059fc5bcf00d"  %>

Comme je souhaite exposer le WSDL de mon service, mais là encore je ne veux pas ajouter de configuration pour ajouter le endpoint de MEX, je vais ajouter une référence à l’assembly Microsoft.SharePoint.Client.ServerRuntime dans le projet contenant l’implémentation du service WCF. Cet assembly n’est que dans le GAC. Dans la fenêtre Add Reference de VS, utiliser l’onglet « Browse » et parcourir dans le dossier C:\Windows\Assembly\Gac_MSIL\Microsoft.SharePoint.Client.ServerRuntime\14.0.0.0__71e9bce111e9429c\ à la recherche de Microsoft.SharePoint.Client.ServerRuntime.dll Cet assembly me permet d’ajouter un attribut qui va ensuite être utilisé par la factory utilisée dans la directive svchost pour exposer les méta datas. J’ajoute donc sur la classe qui implémente mon service les 2 attributs suivants :

[BasicHttpBindingServiceMetadataExchangeEndpointAttribute]
        [AspNetCompatibilityRequirementsAttribute(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)]
        

(notez que le 2nd attribut n’a rien à voir avec la factory pour les MeX…)

Si vous utilisez le mot clé $SharePoint.Project.AssemblyFullName$ sachez qu’en principe il est remplacé automatiquement par VisuaStudio 2010 lors du packaging de votre solution, sauf que par défaut les fichier svc sont ignorés. Il faut donc ajouter une configuration à la main dans le fichier csproj. Déchargez le projet pour éditer directement le xml et ajoutez le nœud xml suivant en enfant du premier PropertyGroup :

<tokenreplacementfileextensions>svc</tokenreplacementfileextensions>

Je dois aussi inclure les assembly nécessaires à l’éxécution de mon service dans la solution SharePoint afin qu’ils soient correctement déployés dans le GAC en même temps que le reste. Pour celà je modifie le package en mode "avancé" et j’ajoute des projects output assembly pour ajouter tout les assemblies nécessaires

image

Enfin je déploie mon service et pour tester déjà qu’il est correctement accessible j’utilise l’url suivante :

http://NomDuServeur:Port/_vti_bin/NomDuDossierDeVotreSvc/NomDuSvc.svc/mex

(Le dossier virtuel _vti_bin étant mappé sur le dossier Isapi)

image

Il me reste à tester mon service en ligne. Pour cela rien de plus simple, j’ajoute à ma solution un projet de test unitaire,j’ajoute une “service référence” vers mon service en utilisant l’url citée ci dessus. Enfin j’utilise le proxy pour utiliser mon service. Sourire

image

Il me reste encore 2 étapes pour aller jusqu’au bout :

– Intégrer un contrôle de l’exécution de mon service en fonction du site où il s’exécute (de l’url relative) pour prendre en charge si la feature est bien activée ou pas. Dans l’état pour le moment mon service est utilisable sur n’importe qu’elle url, mais en même temps pour l’instant il n’accède à rien de particulier du site SharePoint….

– Eventuellement ajouter malgré tout de la config notamment pour d’éventuelles quotas ou autre configurations custom nécessaires

Bref, encore deux bons articles en perspective … Sourire

Le code utilisé pour faire cet article se trouve ici : http://www.paslatek.net/code/WcfServiceIntoSP2010.zip

Publié dans SharePoint Tagués avec : , , , , , , , ,

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Verifions que vous êtes un humain * Time limit is exhausted. Please reload CAPTCHA.

Archives

Social

  • Twitter
  • LinkedIn
  • Flux RSS
  • mvp
  • technet
  • Google+