Freigeben über


Erstellen eines benutzerdefinierten WCF-Diensts in SharePoint Foundation

Letzte Änderung: Montag, 7. Februar 2011

Gilt für: SharePoint Foundation 2010

In diesem Teil der exemplarischen Vorgehensweise wird gezeigt, wie ein benutzerdefinierter Windows Communication Foundation (WCF)-Dienst erstellt wird, mit dem Benutzer Listenelemente auf eine vorherige Version zurücksetzen können. Der Versionsverlauf von Listenelementen ist über die anderen Client-APIs nicht verfügbar. Daher wird in diesem Beispiel ein Dienst erstellt, der diese Funktionalität für Clientanwendungen mithilfe des serverseitigen Objektmodells bereitstellt.

Das Beispiel veranschaulicht das Erstellen eines benutzerdefinierten WCF-Diensts in Microsoft Visual Studio 2010 als Microsoft SharePoint Foundation-Projekt, das in jeder Farm bereitgestellt werden kann. Da vom SharePoint Foundation-Projekttyp WCF-Bibliotheken standardmäßig nicht unterstützt werden, wird in dem Beispiel darüber hinaus eine WCF-Dienstbibliothek als externes Projekt erstellt, um die Dateien IService1.cs und Service1.cs bzw. IService1.vb und Service1.vb für das Projekt zu generieren.

In dem Beispiel wird davon ausgegangen, dass Sie die vorherigen beiden Teile dieser exemplarischen Vorgehensweise, Implementieren der SharePoint Foundation REST-Schnittstelle und Implementieren des clientseitigen Objektmodells, abgeschlossen und eine Windows Forms-Anwendung zur Implementierung des benutzerdefinierten WCF-Diensts erstellt haben.

Erstellen eines WCF-Diensts zum Zurücksetzen von Listenelementen auf frühere Versionen

  1. Öffnen Sie in Visual Studio Ihre Projektmappe ProjectTracker, um ein SharePoint Foundation-Projekt für den WCF-Dienst zu erstellen. Klicken Sie im Projektmappen-Explorerauf die Projektmappe. Zeigen Sie im Menü Datei auf Hinzufügen, und klicken Sie auf Neues Projekt. Erweitern Sie auf der Registerkarte Installierte Vorlagen des Dialogfelds Neues Projekt hinzufügen entweder den Knoten Visual Basic oder Visual C#, wählen Sie SharePoint und dann Leeres SharePoint-Projekt aus, und geben Sie RevertService als Namen des Projekts ein. Klicken Sie auf OK.

  2. Überprüfen Sie im Assistenten zum Anpassen von SharePoint, ob die richtige lokale Website zum Debuggen angegeben ist. Da WCF-Dienste von Sandkastenlösungen nicht unterstützt werden, wählen Sie Als Farmlösung bereitstellen aus, und klicken Sie auf Fertig stellen.

  3. Klicken Sie zum Erstellen des externen WCF-Projekts und der zugehörigen CS- bzw. VB-Dateien für IService1 und Service1 erneut auf die Projektmappe ProjectTracker, und gehen Sie wie in Schritt 1 vor, um das Dialogfeld Neues Projekt hinzufügen zu öffnen. Erweitern Sie entweder den Knoten Visual Basic oder Visual C#, wählen Sie WCF und dann WCF-Dienstbibliothek aus, und geben Sie WcfService als Namen ein. Klicken Sie auf OK.

  4. Kopieren Sie die generierten IService1- und Service1-Dateien in das Projekt RevertService. Da Sie das Projekt für die WCF-Dienstbibliothek nicht mehr benötigen, können Sie es aus der Projektmappe entfernen, indem Sie mit der rechten Maustaste auf WCF-Dienstbibliothek klicken und dann auf Entfernen klicken.

  5. Fügen Sie im Projekt RevertService Verweise auf die WCF-Assemblys System.Runtime.Serialization und System.ServiceModel sowie auf Microsoft.SharePoint, die Hauptassembly des Serverobjektmodells, hinzu. Klicken Sie mit der rechten Maustaste auf das Projekt RevertService, klicken Sie auf Verweis hinzufügen, und wählen Sie jede dieser Assemblys auf der Registerkarte .NET aus.

  6. Fügen Sie einen Verweis auf Microsoft.SharePoint.Client.ServerRuntime hinzu, das die von SharePoint Foundation bereitgestellten Dienstinstanzen enthält. Navigieren Sie dazu auf der Registerkarte Durchsuchen des Dialogfelds Verweis hinzufügen zur Datei Microsoft.SharePoint.Client.ServerRuntime.dll in %Windows%\assembly\GAC_MSIL\Microsoft.SharePoint.Client.ServerRuntime, wählen Sie die DLL aus, und klicken Sie auf OK.

  7. Geben Sie den Vertrag des benutzerdefinierten WCF-Diensts in IService1.cs (oder IService1.vb) an, indem Sie den automatisch generierten Dienstvertrag durch die folgende Schnittstellendefinition ersetzen, in der die Revert-Methode den Namen der Liste, in der Änderungen rückgängig gemacht werden sollen, und die ID des zurückzusetzenden Elements akzeptiert.

    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);
        }
    }
    
  8. Geben Sie die Implementierung des Diensts an, indem Sie den automatisch generierten Code von Service1.cs (Service1.vb) durch den folgenden Code ersetzen. Im Beispiel wird mithilfe des SharePoint Foundation-Objektmodells die Liste mit ihrem Namen und das zurückzusetzende Element mit seiner ID abgerufen, das Vorhandensein von Elementversionen überprüft und die Version um eine Version zurückgesetzt:

    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);
                }
            }
        }
    }
    

    Im vorherigen Beispiel verfügt die RevertService-Klasse über ein Attribut für die Bindung, BasicHttpBindingServiceMetadataExchangeEndpointAttribute, das die Dienstinstanz von SharePoint Foundation zum automatischen Erstellen eines Metadatenaustausch-Endpunkts für den Dienst anweist.

  9. Nachdem nun die Implementierung des Diensts abgeschlossen ist, können Sie den Dienst in SharePoint Foundation bereitstellen. Klicken Sie mit der rechten Maustaste auf das Projekt RevertService, zeigen Sie auf Hinzufügen, und klicken Sie auf Zugeordneter SharePoint-Ordner. Wählen Sie im Dialogfeld Zugeordneten SharePoint-Ordner hinzufügen die Option ISAPI aus, und klicken Sie auf OK, um den ISAPI-Ordner der SharePoint Foundation-Struktur dem Projekt RevertService zuzuordnen. Falls von Visual Studio ein Unterordner RevertService im ISAPI-Ordner des Projekts RevertService erstellt wird, klicken Sie mit der rechten Maustaste auf den Unterordner, und klicken Sie auf Entfernen, um ihn zu löschen.

  10. Klicken Sie zum Erstellen einer Registrierungsdatei für den Dienst im ISAPI-Ordner auf den ISAPI-Ordner in dem Projekt, und klicken Sie im Menü Projekt auf Neues Element hinzufügen. Wählen Sie unter Installierte Vorlagen die Option Allgemein aus. Wählen Sie Textdatei aus, benennen Sie die Datei Revert.svc, und klicken Sie auf Hinzufügen.

  11. Fügen Sie in Revert.svc die folgende Dienstdeklaration hinzu, die die SharePoint Foundation-Factorys und den Namespace angibt, der sie enthält. Im Beispiel gibt MultipleBaseAddressBasicHttpBindingServiceHostFactory die Dienstinstanz für den SOAP-Typ von Webdiensten an. In der Dienstklassendeklaration wird außerdem der Name der Dienstklasse und mithilfe eines Tokens der starke Name der Assembly angegeben.

    <%@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" %>
    

    Wenn Sie den Dienst in Visual Basic erstellen, geben Sie VB anstelle von C# als Sprache an, und schließen Sie den Namen des SharePoint Foundation-Projekts, den Sie in Schritt 1 angegeben haben, folgendermaßen in das Service-Attribut ein:

    <%@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" %>
    
  12. Da in Visual Studio 2010 der Tokentyp, der in der vorherigen SVC-Datei verwendet wurde, standardmäßig nicht verarbeitet wird, müssen Sie eine weitere Anweisung in der Projektdatei hinzufügen. Speichern Sie alle Änderungen in dem Projekt, klicken Sie mit der rechten Maustaste auf das Projekt RevertService, und klicken Sie auf Projekt entladen. Klicken Sie erneut mit der rechten Maustaste auf den Knoten RevertService, klicken Sie auf RevertService.csproj bearbeiten bzw. RevertService.vbproj bearbeiten, und fügen Sie der ersten Eigenschaftengruppe in der CSPROJ- oder VBPROJ-Datei wie folgt ein <TokenReplacementFileExtensions>-Tag hinzu, um die Verarbeitung von Token in SVC-Dateitypen zu aktivieren.

    <?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>
    . . . .
    
  13. Speichern Sie nach dem Hinzufügen des vorherigen Tags das Projekt, und schließen Sie die CSPROJ-Datei. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt RevertService, und klicken Sie auf Projekt erneut laden.

  14. Klicken Sie zum Bereitstellen des benutzerdefinierten Webdiensts in SharePoint Foundation im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt RevertService, und klicken Sie auf Bereitstellen. Der Code des Projekts wird von Visual Studio kompiliert und eine WSP-Datei erstellt, die auf dem Front-End-Server bereitgestellt wird.

  15. Damit der benutzerdefinierte Webdienst in der Clientanwendung ProjectTracker verwendet wird, klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Knoten Dienstverweise der Anwendung, und klicken Sie auf Dienstverweis hinzufügen. Geben Sie im Dialogfeld Dienstverweis hinzufügen im Feld Adresse die URL des benutzerdefinierten WCF-Diensts ein, und geben Sie MEX wie folgt als Standardnamen für den Metadatenaustausch-Endpunkt an: https://Server/sites/SiteCollection/MyWebSite/_vti_bin/Revert.svc. Klicken Sie auf Gehe zu, um die Dienstinformationen herunterzuladen, und klicken Sie dann auf OK, um den Verweis hinzuzufügen.

  16. Klicken Sie mit der rechten Maustaste auf die Titelleiste des Formulars neben der Schaltfläche Speichern, und wählen Sie in der daraufhin angezeigten Dropdownliste die Option Schaltfläche aus, um in Form1 eine Schaltfläche zum Zurücksetzen hinzuzufügen, die den benutzerdefinierten Dienst implementiert.

  17. Legen Sie im Fenster Eigenschaften für die Schaltfläche die Option Anzeigestil auf Text fest, und geben Sie Revert als Wert für die Einstellung Text ein.

  18. Doppelklicken Sie auf die Schaltfläche Revert, und fügen Sie dem zugehörigen Click-Ereignis den folgenden standardmäßigen Setupcode für den WCF-Proxy mit einem Aufruf Ihres benutzerdefinierten WCF-Diensts hinzu. Lösen Sie Verweise auf Assemblys auf, indem Sie mit der rechten Maustaste auf rot unterstrichene Elemente im Code klicken, auf Auflösen zeigen und die empfohlenen Assemblyverweise für den System.ServiceModel-Namespace und für den Namespace des benutzerdefinierten WCF-Diensts (ProjectTracker.ServiceReference2) übernehmen.

    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();
    }
    

    Beachten Sie, dass im Aufruf der Revert-Methode im vorherigen Beispiel der Name der SharePoint Foundation-Liste angegeben ist und dass die Current-Eigenschaft verwendet wird, um die ID des derzeit ausgewählten Elements im DataGridView-Steuerelement des Projekts zurückzugeben. Nach dem Aufruf des Webdiensts wird vom Code die Benutzeroberfläche aktualisiert, und Daten werden erneut aus SharePoint Foundation abgerufen.

  19. Drücken Sie F5, um die Clientanwendung ausführen, und testen Sie den Webdienst, indem Sie ein Element im DataGridView-Steuerelement ändern und auf die Schaltfläche Revert klicken.

Das vollständige Form1-Codebeispiel finden Sie unter Vollständiges SharePoint Foundation WCF-Beispiel "Form1".

Siehe auch

Konzepte

Exemplarische Vorgehensweise: Erstellen und Implementieren eines benutzerdefinierten WCF-Diensts in SharePoint Foundation

WCF-Dienste in SharePoint Foundation 2010

Weitere Ressourcen

Windows Communication Foundation

Configuring Windows Communication Foundation Services