Création d’un service WCF personnalisé dans SharePoint Foundation
Dernière modification : lundi 7 février 2011
S’applique à : SharePoint Foundation 2010
Cette partie de la procédure montre comment créer un service WCF (Windows Communication Foundation) personnalisé qui permet aux utilisateurs de rétablir les éléments de liste dans leurs versions précédentes. L’historique des versions des éléments de liste n’est pas exposé via les autres API clientes ; cet exemple crée un service qui utilise le modèle objet côté serveur afin de fournir cette fonctionnalité aux applications clientes.
L’exemple montre comment créer un service WCF dans Microsoft Visual Studio 2010 en tant que projet Microsoft SharePoint Foundation que vous pouvez déployer sur une batterie. En outre, comme le type de projet SharePoint Foundation ne prend pas en charge les bibliothèques WCF par défaut, cet exemple nécessite de créer une bibliothèque de service WCF comme projet externe afin de générer les fichiers .cs ou .vb IService1 et Service1 pour votre projet.
Cet exemple présume que vous avez achevé les deux parties précédentes de la présentation pas à pas (Implémentation de l’interface REST SharePoint Foundation et Implémentation du modèle objet côté client) et créé une application Windows Forms utilisée pour implémenter le service WCF personnalisé.
Création d’un service WCF pour rétablir les éléments de liste dans leurs versions précédentes
Pour créer un projet SharePoint Foundation pour le service WCF, ouvrez votre solution ProjectTracker dans Visual Studio. Dans l’Explorateur de solutions, cliquez sur la solution. Dans le menu Fichier, pointez sur Ajouter, puis cliquez sur Nouveau projet. Sous l’onglet Modèles installés de la boîte de dialogue Ajouter un nouveau projet, développez le nœud Visual Basic ou Visual C#, sélectionnez SharePoint, sélectionnez Projet SharePoint vide, puis entrez RevertService comme nom du projet. Cliquez enfin sur OK.
Dans l’Assistant Personnalisation de SharePoint, vérifiez que le site local correct est spécifié pour le débogage. Comme les solutions en bac à sable ne prennent pas en charge les services WCF, sélectionnez Déployer en tant que solution de batterie, puis cliquez sur Terminer.
Pour créer le projet WCF externe pour obtenir ses fichiers .cs ou .vb IService1 et Service1, cliquez sur la solution ProjectTracker et suivez la même procédure que celle de la première étape pour ouvrir la boîte de dialogue Ajouter un nouveau projet. Développez le nœud Visual Basic ou Visual C#, sélectionnez WCF, sélectionnez Bibliothèque de services WCF, tapez WcfService comme nom, puis cliquez sur OK.
Copiez les fichiers IService1 et Service1 générés dans le projet RevertService. Comme vous n’avez plus besoin du projet Bibliothèque de services WCF, vous pouvez le supprimer de la solution en cliquant avec le bouton droit sur la Bibliothèque de services WCF, puis en cliquant sur Supprimer.
Ajoutez dans le projet RevertService les références aux assemblys WCF System.Runtime.Serialization et System.ServiceModel, et à Microsoft.SharePoint, l’assembly principal du modèle objet serveur. Cliquez avec le bouton droit sur le projet RevertService, cliquez sur Ajouter une référence, puis sélectionnez chacun des assemblys sous l’onglet .NET.
Pour ajouter une référence à Microsoft.SharePoint.Client.ServerRuntime, qui contient les fabriques de services fournies par SharePoint Foundation, utilisez l’onglet Parcourir de la zone Ajouter une référence au fichier Microsoft.SharePoint.Client.ServerRuntime.dll dans %Windows%\assembly\GAC_MSIL\Microsoft.SharePoint.Client.ServerRuntime, sélectionnez la DLL, puis cliquez sur OK.
Pour spécifier le contrat de votre service WCF personnalisé dans IService1.cs (ou IService1.vb), remplacez le contrat de service généré automatiquement par la définition d’interface suivante, où la méthode Revert accepte le nom de la liste dans laquelle rétablir les modifications et l’ID de l’élément à rétablir :
Imports System.Runtime.Serialization Imports System.ServiceModel Namespace WcfService <ServiceContract()> _ Public Interface IRevert <OperationContract()> _ Sub Revert(ByVal listName As String, ByVal listItemId As Integer) End Interface End Namespace
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WcfService { [ServiceContract] public interface IRevert { [OperationContract] void Revert(string listName, int listItemId); } }
Spécifiez l’implémentation du service en remplaçant le code généré automatiquement de Service1.cs (Service1.vb) par le code ci-après. L’exemple utilise le modèle objet SharePoint Foundation pour extraire la liste par son nom, pour extraire l’élément à rétablir par son ID et pour vérifier la présence de versions d’élément et les rétablir sous une seule version :
Imports Microsoft.SharePoint.Client.Services Imports System.ServiceModel.Activation Namespace WcfService <BasicHttpBindingServiceMetadataExchangeEndpointAttribute()> _ <AspNetCompatibilityRequirements(RequirementsMode := AspNetCompatibilityRequirementsMode.Required)> _ Public Class RevertService Implements IRevert Public Sub Revert(ByVal listName As String, ByVal listItemId As Integer) Implements IRevert.Revert Dim oList As SPList = SPContext.Current.Web.Lists(listName) Dim oItem As SPListItem = oList.GetItemById(listItemId) If oItem.Versions.Count > 1 Then oItem.Versions.Restore(1) End If End Sub End Class End Namespace
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace WcfService { using Microsoft.SharePoint.Client.Services; using System.ServiceModel.Activation; using Microsoft.SharePoint; [BasicHttpBindingServiceMetadataExchangeEndpointAttribute] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] public class RevertService : IRevert { public void Revert(string listName, int listItemId) { SPList oList = SPContext.Current.Web.Lists[listName]; SPListItem oItem = oList.GetItemById(listItemId); if (oItem.Versions.Count > 1) { oItem.Versions.Restore(1); } } } }
Dans l’exemple précédent, la classe RevertService possède un attribut pour la liaison, BasicHttpBindingServiceMetadataExchangeEndpointAttribute, qui demande à la fabrique de service SharePoint Foundation de créer automatiquement un point de terminaison d’échange de métadonnées pour le service.
Maintenant que l’implémentation du service est prête, vous pouvez déployer le service sur SharePoint Foundation. Cliquez avec le bouton droit sur le projet RevertService, pointez sur Ajouter, puis cliquez sur Dossier mappé SharePoint. Dans la boîte de dialogue Ajouter un dossier mappé SharePoint, sélectionnez ISAPI, puis cliquez sur OK pour mapper le dossier ISAPI de la ruche SharePoint Foundation avec le projet RevertService. Si Visual Studio crée un sous-dossier RevertService au sein du dossier ISAPI du projet RevertService, cliquez avec le bouton droit sur le sous-dossier et cliquez sur Supprimer.
Pour créer un fichier d’inscription pour votre service au sein du dossier ISAPI, cliquez sur ce dernier dans votre projet, puis dans le menu Projet, cliquez sur Ajouter un nouvel élément. Sous Modèles installés, sélectionnez Général. Sélectionnez Fichier texte, attribuez le nom de Revert.svc au fichier, puis cliquez sur Ajouter.
Ajoutez la déclaration de service suivante à Revert.svc, qui spécifie les fabriques SharePoint Foundation et l’espace de noms qui les contient. Dans l’exemple, MultipleBaseAddressBasicHttpBindingServiceHostFactory spécifie la fabrique de service du type SOAP de service Web. La déclaration de classe de service spécifie aussi le nom de la classe de service et utilise un jeton pour indiquer le nom fort de l’assembly.
<%@ServiceHost Language="C#" Debug="true" Service="WcfService.RevertService, $SharePoint.Project.AssemblyFullName$" Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressBasicHttpBindingServiceHostFactory, Microsoft.SharePoint.Client.ServerRuntime, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
Si vous créez le service dans Visual Basic, spécifiez VB au lieu de C# comme langage, et dans l’attribut Service, incluez le nom de votre projet SharePoint Foundation, comme spécifié dans la première étape, comme ci-après :
<%@ServiceHost Language="VB" Debug="true" Service="RevertService.WcfService.RevertService, $SharePoint.Project.AssemblyFullName$" Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressBasicHttpBindingServiceHostFactory, Microsoft.SharePoint.Client.ServerRuntime, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
Comme, par défaut, Visual Studio 2010 ne traite pas le type de jetons utilisés dans le fichier .svc précédent, vous devez ajouter une instruction dans le fichier de projet. Enregistrez toutes les modifications apportées à votre projet, cliquez avec le bouton droit sur le projet RevertService, puis cliquez sur Décharger le projet. Cliquez avec le bouton droit sur le nœud RevertService, cliquez sur Modifier RevertService.csproj ou sur Modifier RevertService.vbproj, puis ajoutez une balise <TokenReplacementFileExtensions> comme suit au premier groupe de propriétés du fichier .csproj ou .vbproj pour permettre le traitement des jetons dans les types de fichiers .svc.
<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>{F455078E-8836-403A-9E63-5E5F21B5F694}</ProjectGuid> <OutputType>Library</OutputType> <AppDesignerFolder>Properties</AppDesignerFolder> <RootNamespace>RevertService</RootNamespace> <AssemblyName>RevertService</AssemblyName> <TargetFrameworkVersion>v3.5</TargetFrameworkVersion> <FileAlignment>512</FileAlignment> <ProjectTypeGuids>{BB1F664B-9266-4fd6-B973-E1E44974B511};{14822709-B5A1-4724-98CA-57A101D1B079};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> <SandboxedSolution>False</SandboxedSolution> <TokenReplacementFileExtensions>svc</TokenReplacementFileExtensions> </PropertyGroup> . . . .
Après avoir ajouté la précédente balise, enregistrez le projet et fermez le fichier .csproj. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet RevertService, puis cliquez sur Recharger le projet.
Pour déployer le service Web personnalisé sur SharePoint Foundation, dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet RevertService, puis cliquez sur Déployer. Visual Studio compile le code du projet, génère un fichier WSP et déploie le fichier sur le serveur Web frontal.
Pour utiliser le service Web personnalisé depuis votre application cliente ProjectTracker, cliquez avec le bouton droit sur le nœud Références de service de l’application dans l’Explorateur de solutions, puis cliquez sur Ajouter une référence de service. Dans la boîte de dialogue Ajouter une référence de service, tapez l’URL de votre service WCF personnalisé dans la zone Adresse, puis spécifiez MEX comme nom standard du point de terminaison d’échange des métadonnées, comme suit : https://Server/sites/SiteCollection/MyWebSite/_vti_bin/Revert.svc. Cliquez sur Aller à pour télécharger les informations de service, puis cliquez sur OK pour ajouter la référence.
Pour ajouter un bouton Rétablir dans le formulaire Form1 qui implémente le service personnalisé, cliquez avec le bouton droit sur la barre de titre du formulaire à côté du bouton Enregistrer, puis sélectionnez Bouton dans la liste déroulante qui apparaît.
Dans la fenêtre Propriétés du bouton, définissez DisplayStyle avec la valeur Texte et tapez Revert comme valeur de Texte.
Double-cliquez sur le bouton Rétablir et ajoutez à son événement Click le code standard suivant de configuration du proxy WCF, avec un appel à votre service WCF personnalisé. Pour résoudre les références aux assemblys, cliquez avec le bouton droit sur les éléments du code surlignés en rouge, pointez sur Résoudre et acceptez les références d’assembly recommandées pour l’espace de noms System.ServiceModel et pour l’espace de noms de votre service WCF personnalisé (ProjectTracker.ServiceReference2).
Private Sub toolStripButton2_Click(ByVal sender As Object, ByVal e As EventArgs) ' Set up proxy. Dim binding As New BasicHttpBinding() binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm Dim endpoint As New EndpointAddress(websiteUrl + "/_vti_bin/Revert.svc") Dim proxy As New RevertClient(binding, endpoint) proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation ' Call web service. proxy.Revert("Projects", DirectCast(projectsBindingSource.Current, ProjectsItem).Id) ' Refresh the UI. context.MergeOption = System.Data.Services.Client.MergeOption.OverwriteChanges context.Projects.ToList() projectsBindingSource.ResetCurrentItem() End Sub
private void toolStripButton2_Click(object sender, EventArgs e) { // Set up proxy. BasicHttpBinding binding = new BasicHttpBinding(); binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm; EndpointAddress endpoint = new EndpointAddress(websiteUrl + "/_vti_bin/Revert.svc"); RevertClient proxy = new RevertClient(binding, endpoint); proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; // Call web service. proxy.Revert("Projects", ((ProjectsItem)projectsBindingSource.Current).Id); // Refresh the UI. context.MergeOption = System.Data.Services.Client.MergeOption.OverwriteChanges; context.Projects.ToList(); projectsBindingSource.ResetCurrentItem(); }
Notez que, dans l’appel de la méthode Revert de l’exemple précédent, le nom de la liste SharePoint Foundation est spécifié et que la propriété Current est utilisée pour renvoyer l’ID de l’élément sélectionné dans le contrôle DataGridView dans Projets. Après l’appel du service Web, le code actualise l’interface utilisateur et extrait à nouveau les données de SharePoint Foundation.
Appuyez sur F5 pour exécuter l’application cliente et testez le service Web en modifiant un élément dans le contrôle DataGridView dans Projets, puis en cliquant sur le bouton Rétablir.
Pour obtenir l’exemple de code complet de Form1, voir Exemple Form1 WCF SharePoint Foundation complet.
Voir aussi
Concepts
Services WCF dans SharePoint Foundation 2010