カスタム WCF サービスを SharePoint Foundation で作成する

最終更新日: 2011年2月7日

適用対象: SharePoint Foundation 2010

チュートリアルのこの部分では、ユーザーがリスト アイテムをその以前のバージョンに戻すことができるカスタムの Windows Communication Foundation (WCF) サービスを作成する方法について説明します。リスト アイテムのバージョン履歴は他のクライアント API では公開されません。したがって、この例では、サーバー側のオブジェクト モデルを使用してこの機能をクライアント アプリケーションに提供するサービスを作成します。

この例は、Microsoft Visual Studio 2010 で、あらゆるファームに展開できる Microsoft SharePoint Foundation プロジェクトとしてカスタム WCF サービスを作成する方法を示しています。また、SharePoint Foundation プロジェクト タイプでは WCF ライブラリが既定でサポートされないため、この例では、WCF サービス ライブラリを外部プロジェクトとして作成し、プロジェクト用の IService1 および Service1 の .cs または .vb ファイルを生成します。

この例は、このチュートリアルの以前の 2 つの部分 (「SharePoint Foundation REST インターフェイスを実装する」および「クライアント側オブジェクト モデルを実装する」) が完了し、カスタム WCF サービスを実装するために使用する Windows Forms アプリケーションが既に作成されていることを前提とします。

リスト アイテムを以前のバージョンに戻す WCF サービスを作成する

  1. WCF サービス用の SharePoint Foundation プロジェクトを作成するには、Visual Studio で ProjectTracker ソリューションを開き、ソリューション エクスプローラーでソリューションをクリックします。[ファイル] メニューで [追加] をポイントして、[新しいプロジェクト] をクリックします。[新しいプロジェクトの追加] ダイアログ ボックスの [インストールされているテンプレート] タブで、[Visual Basic] または [Visual C#] ノードを展開し、[SharePoint]、[空の SharePoint プロジェクト] の順に選択して、プロジェクト名として「RevertService」と入力します。[OK] をクリックします。

  2. SharePoint カスタマイズ ウィザードで、デバッグのために正しいローカル サイトが指定されていることを確認します。サンドボックス ソリューションでは WCF サービスがサポートされないので、[ファーム ソリューションとして配置する] を選択し、[完了] をクリックします。

  3. 外部 WCF プロジェクトを作成してその IService1 および Service1 の .cs または .vb ファイルを取得するには、ProjectTracker ソリューションを再度クリックし、手順 1. と同じ手順に従って、[新しいプロジェクトの追加] ダイアログ ボックスを開きます。[Visual Basic] または [Visual C#] ノードを展開し、[WCF]、[WCF サービス ライブラリ] の順に選択して、名前として「WcfService」と入力し、[OK] をクリックします。

  4. 生成された IService1 および Service1 ファイルを RevertService プロジェクトにコピーします。WCF サービス ライブラリ プロジェクトは必要がなくなったのでソリューションから削除できます。削除するには、[WCF サービス ライブラリ] を右クリックして、[削除] をクリックします。

  5. RevertService プロジェクト内の参照を、System.Runtime.Serialization と System.ServiceModel WCF アセンブリ、および Microsoft.SharePoint (サーバー オブジェクト モデルのメイン アセンブリ) に追加します。RevertService プロジェクトを右クリックし、[参照の追加] をクリックして、[.NET] タブでこれらの各アセンブリを選択します。

  6. SharePoint Foundation で提供されるサービス ファクトリを含む Microsoft.SharePoint.Client.ServerRuntime への参照を追加するには、[参照の追加] ボックスの [参照] タブを使用して、%Windows%\assembly\GAC_MSIL\Microsoft.SharePoint.Client.ServerRuntime 内の Microsoft.SharePoint.Client.ServerRuntime.dll ファイルにアクセスし、その DLL を選択して、[OK] をクリックします。

  7. IService1.cs (または IService1.vb) にカスタム WCF サービスのコントラクトを指定するには、自動生成されたサービス コントラクトを以下のインターフェイス定義で置き換えます。ここで、Revert メソッドは、変更を元に戻すリストの名前、および元に戻すアイテムの ID を受け入れます。

    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. Service1.cs (Service1.vb) の自動生成されたコードを以下のコードで置き換えてサービスの実装を指定します。例では、SharePoint Foundation オブジェクト モデルを使用して、その名前によってリストを取得し、ID によって元に戻すアイテムを取得し、アイテムのバージョンがあるかどうかを確認し、それらを 1 つのバージョンによって戻します。

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

    前の例では、RevertService クラスにバインド用の属性 (BasicHttpBindingServiceMetadataExchangeEndpointAttribute) があります。これは、サービスのメタデータ交換エンドポイントを自動作成するように SharePoint Foundation サービス ファクトリに指示します。

  9. これでサービスの実装準備ができました。サービスを SharePoint Foundation に展開できます。RevertService プロジェクトを右クリックし、[追加] をポイントして、[SharePoint のマップされたフォルダー] をクリックします。[SharePoint のマップされたフォルダーの追加] ダイアログ ボックスで、[ISAPI] を選択し、[OK] をクリックして、SharePoint Foundation ハイブの ISAPI フォルダーを RevertService プロジェクトにマップします。Visual Studio が RevertService プロジェクトの ISAPI フォルダーに RevertService サブフォルダーを作成する場合は、そのサブフォルダーを右クリックして、[削除] をクリックし、サブフォルダーを削除します。

  10. サービスの登録ファイルを ISAPI フォルダーに作成するには、プロジェクト内の ISAPI フォルダーをクリックし、[プロジェクト] メニューで [新しいアイテムの追加] をクリックします。次に、[インストールされているテンプレート] で [全般]、[テキスト ファイル] の順に選択し、ファイルに Revert.svc という名前を付けて、[追加] をクリックします。

  11. 以下のサービス宣言を Revert.svc に追加します。この宣言では、SharePoint Foundation ファクトリと、そのファクトリを含む名前空間が指定されます。例の MultipleBaseAddressBasicHttpBindingServiceHostFactory では、SOAP タイプの Web サービス用のサービス ファクトリが指定されています。サービス クラス宣言でも、サービス クラスの名前が指定され、トークンを使用してアセンブリの厳密な名前が指定されます。

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

    サービスを Visual Basic で作成する場合は、言語として C# の代わりに VB を指定し、Service 属性では、手順 1. で指定した SharePoint Foundation プロジェクトの名前を次のように含めます。

    <%@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. 既定では、Visual Studio 2010 は、前述の .svc ファイルで使用されるトークンのタイプを処理しないので、追加の指示をプロジェクト ファイルに追加する必要があります。すべての変更をプロジェクトに保存し、RevertService プロジェクトを右クリックして、[プロジェクトのアンロード] をクリックします。RevertService を再度右クリックし、[RevertService.csproj を編集する] または [RevertService.vbproj を編集する] をクリックして、次のように <TokenReplacementFileExtensions> タグを .csproj または .vbproj ファイルの 1 番目のプロパティ グループに追加し, .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>
    . . . .
    
  13. 前述のタグを追加した後に、プロジェクトを保存し, .csproj ファイルを閉じます。ソリューション エクスプローラーRevertService プロジェクトを右クリックし、[プロジェクトの再読み込み] をクリックします。

  14. カスタム Web サービスを SharePoint Foundation に展開するには、ソリューション エクスプローラーRevertService プロジェクトを右クリックし、[配置] をクリックします。Visual Studio は、プロジェクトのコードをコンパイルし、WSP ファイルを構築して、そのファイルをフロントエンド Web サーバーに展開します。

  15. カスタム Web サービスを ProjectTracker クライアント アプリケーションから使用するには、ソリューション エクスプローラーでアプリケーションの [サービスの参照] ノードを右クリックし、[サービス参照の追加] をクリックします。[サービス参照の追加] ダイアログ ボックスで、カスタム WCF サービスの URL を [アドレス] ボックスに入力し、MEX をメタデータ交換エンドポイントの標準名として指定します。たとえば、「https://Server/sites/SiteCollection/MyWebSite/_vti_bin/Revert.svc」と入力します。[移動] をクリックしてサービス情報をダウンロードし、[OK] をクリックして参照を追加します。

  16. カスタム サービスを実装する Form1 に Revert ボタンを追加するには、[保存] ボタンの横のフォーム タイトル バーを右クリックし、表示されたドロップダウン リストで [ボタン] を選択します。

  17. ボタンの [プロパティ] ウィンドウで、[表示スタイル] を [テキスト] に設定し、[テキスト] 設定の値として「Revert」と入力します。

  18. Revert ボタンをダブルクリックし、その Click イベントに以下の標準の WCF プロキシ セットアップ コードとカスタム WCF サービスの呼び出しを追加します。コード内の赤い下線の要素を右クリックして、[解決] をポイントし、System.ServiceModel 名前空間およびカスタム WCF サービス (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();
    }
    

    前述の例の Revert メソッド呼び出しは、SharePoint Foundation リストの名前を指定します。また、Current プロパティを使用して、プロジェクト DataGridView コントロール内の現在選択されているアイテムの ID を返します。コードは、Web サービス呼び出しの後で、ユーザー インターフェイス (UI) を更新し、データを SharePoint Foundation から再取得します。

  19. F5 キーを押してクライアント アプリケーションを実行します。また、プロジェクト DataGridView 内のアイテムを変更し、Revert ボタンをクリックして、Web サービスをテストします。

完全な Form1 コード例については、「SharePoint Foundation の WCF Form1 サンプルを完了する」を参照してください。

関連項目

概念

[チュートリアル] SharePoint Foundation でカスタム WCF サービスの作成と実装を行う

SharePoint Foundation 2010 の WCF サービス

その他の技術情報

Windows Communication Foundation

Configuring Windows Communication Foundation Services