WCF: Services for SharePoint 2010 Business Connectivity Services 用 WCF Web サービスのビルド (パート 1/4)

概要:   この 4 部構成の記事では、Microsoft SharePoint Foundation 2010 におけるユーザーの認証について学習します。Microsoft Business Connectivity Services (BCS) の外部コンテンツ タイプとして使用できる Windows Communication Foundation (WCF) Web サービスを作成します。

最終更新日: 2011年11月4日

SharePoint Online で使用可能

この記事の内容
概要
前提条件
Windows Communication Foundation (WCF) とインターネット インフォメーション サービスをインストールする
サービス モデルを登録する
スクリプト マップを更新する
Web サービスを作成する
Web サービスを検証する
まとめ
その他の技術情報

適用対象: Business Connectivity Services | Office 2010 | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio

提供元:   Eric White、Microsoft Corporation | Saji Varkey、Microsoft Corporation | Bin Zhang、Microsoft Corporation

目次

  • 概要

  • 前提条件

  • Windows Communication Foundation (WCF) とインターネット インフォメーション サービスをインストールする

  • サービス モデルを登録する

  • スクリプト マップを更新する

  • Web サービスを作成する

  • Web サービスを検証する

  • まとめ

  • その他の技術情報

この記事は、Business Connectivity Services を使用してクレーム対応の Web サービスを作成して使用するまでの手順を説明した 4 部構成の記事の第 1 回目です。このシリーズの他の記事も参照してください。

概要

この記事では、WCF を使用してごく単純な Web サービスを作成する方法を説明します。この記事で紹介する Web サービスは、単純ながら Business Connectivity Services の外部コンテンツ タイプとして使用できるという特性を備えています。この記事の手順説明では、インターネット インフォメーション サービス (IIS) を使用してこの Web サービスをホストする方法も示します。

この Web サービスには次の 2 つのメソッドしかありません。1 つはアイテムのコレクションを取得する finder メソッドで、もう 1 つは特定のアイテムを取得する specific finder メソッドです。このコレクションを支えるデータとして、ある初期化されたリストが存在します。この小さなデータベースのスキーマはごく単純です。これは 2 つのフィールド (整数フィールド CustomerID と文字列フィールド CustomerName) から成る無階層の単一のテーブルです。CustomerID は一意の識別子です。次のスニペットは、この Web サービスで処理されるデータが入っているリストの初期化方法を示しています。

return new List<Customer>()
{
    new Customer
    {
        CustomerID = 1,
        CustomerName = "Bob",
    },
    new Customer
    {
        CustomerID = 2,
        CustomerName = "Bill",
    },
    new Customer
    {
        CustomerID = 3,
        CustomerName = "Cheryl",
    },
};

この Web サービスをビルドして構成した後、SharePoint Designer 2010 を使用して、そこから外部コンテンツ タイプを作成し、SharePoint リストのデータを表示できます。次の図に SharePoint の外部リストを示します。

図 1. SharePoint 2010 の外部リスト

SharePoint 2010 外部リスト

ご承知のように SharePoint Foundation 2010 と SharePoint Server 2010 における Business Connectivity Services には読み取りと書き込みの両方の機能があります。メソッドを追加してアイテムを作成、更新、削除する機能を提供すれば、リスト内のデータを完全にメンテナンスできます。できるだけ単純にしたいので、この Web サービスは読み取りのみの機能を持つものとして実装してあります。ここではセキュリティの問題と同一性の問題に力点を置いています。データベースの格納方法、格納場所、およびスキーマの詳細については、ここでは説明しません。

ここで紹介する手順は、Windows Server 2008 R2 と Windows Server 2008 を想定しています。この Web サービスは、Microsoft Visual Studio 2010 と Visual Studio 2008 のどちらでもビルドできます。

この記事の Web サービスは、インターネット インフォメーション サービスを実行している任意の開発コンピューターでビルドし、実行し、テストすることができます。ただし、Business Connectivity Services を使用してこの Web サービスに外部コンテンツ タイプとして接続する場合は、このサンプルを SharePoint 2010 開発環境でビルドして、SharePoint Foundation 2010 または SharePoint Server 2010 とサンプルの Web サービスが同一のコンピューターで実行されるようにしてください。この Web サービスを別のサーバー上に置いて、外部コンテンツ タイプとして使用することもできます。しかし、その場合は、セキュリティを解除するか、クレーム対応の Web サービスを作成しなければなりません。

前述のとおり、この記事の手順では Web サービスを IIS のもとでホストする方法を示しています。これは、この種の Web サービスを実装する人々が通常それをホストするときの方法を表しています。IIS のサービスとしてホストすることには、プロセスのリサイクル、プロセスの健全性監視、メッセージ ベースのアクティブ化など、多くのメリットがあります。

前提条件

この手順は、Windows Server 2008 または Windows Server 2008 R2 を想定しています。両方のケースについて、新規にインストールしたパッチ済みのオペレーティング システムの稼働するサーバーを開始しました。次に、必要な役割と機能をインストールして、IIS がインストールされ、実行されるようにしました。さらに、この記事の手順では, .NET Framework 3.5.1 と、Visual Studio 2008 または Visual Studio 2010 が必要とされます。

Windows Communication Foundation (WCF) とインターネット インフォメーション サービスをインストールする

サーバー マネージャーを使用して、Web サーバー (IIS) の役割と .NET Framework 3.5.1 の機能をインストールします。

このサンプルを実行するために必須の唯一の役割は Web サーバー (IIS) です。次の図に役割の追加ウィザードのダイアログを示します。

図 2. 役割の追加ウィザードで Web サーバーの役割を選択する

役割の追加ウィザードで [Web サーバー] を選択する

Web サーバー (IIS) の役割を追加した後、ウィザードから [役割サービス] を選択するよう求められます。これに対しては、[アプリケーション開発] を選択します。次の図に役割の追加ウィザードのダイアログを示します。

図 3. 役割の追加ウィザードでアプリケーション開発を選択する

役割の追加ウィザードで [アプリケーション開発] を選択する

.NET Framework をインストールするために、[.NET Framework 3.5.1 の機能] を追加します。次の図に役割の追加ウィザードのダイアログを示します。

図 4. 役割の追加ウィザードで .NET Framework 3.5.1 の機能を選択する

.NET Framework 3.5.1 を選択する

この機能を Windows Server 2008 (R2 以外) にインストールするときは、[.NET Framework 3.0 の機能] を選択した後、[WCF アクティブ化] を選択します。これは Windows Server 2008 R2 での既定の選択です。次の図に役割の追加ウィザードのダイアログを示します。

図 5. WCF アクティブ化を選択する

Windows Server 2008 で WCF アクティブ化を選択する

WCF と IIS の両方をインストールしないと、IIS でホストされる WCF サービスは正常に機能しません。WCF (.NET Framework 3.0 に含まれる) と IIS のインストール手順は使用しているオペレーティング システムによって異なります。Windows Server 2008、Windows Server 2008 R2 以外のオペレーティング システムにインストールする場合は、「Microsoft .NET Framework 3.0 再頒布可能パッケージ」を参照して, .NET Framework 3.0 をダウンロードし、インストールしてください。「Installing IIS (英語)」を参照してください。

サービス モデルを登録する

このサンプルを実行するには、このバージョンの WCF を登録し、IIS メタベース ルートにあるスクリプト マップを更新する必要があります。

サービス モデルを登録するには

  1. Visual Studio コマンド プロンプトを開始します。administrator として実行してください。次の図に、管理者として実行しているコマンド プロンプトを示します。

    図 6. Visual Studio コマンド プロンプトを管理者として実行する

    管理者としてコマンド プロンプトを実行する

    [スタート] ボタンをクリックし、[すべてのプログラム]、[Visual Studio 2010]、[Visual Studio ツール] の順に選択し、[Visual Studio コマンド プロンプト] を右クリックし、[管理者として実行] を選択します。

    Visual Studio コマンド プロンプトは、Visual Studio 2008 のときと同じような場所にあります。

  2. 現在のディレクトリを次の場所に変更します。

    c:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation

  3. コマンド プロンプトで、次のように入力します。

    ServiceModelReg -i

    次の図に、ServiceModelReg が実行している様子を示します。

    図 7. ServiceModelReg が実行している様子

    ServiceModelReg の実行

    注意

    これは Visual Studio コマンド プロンプトである必要はありませんでした。しかし、次のステップで Visual Studio コマンド プロンプトが必要になるため、手際を考えて、このステップで作成しました。

スクリプト マップを更新する

スクリプト マップを更新するには

  • コマンド プロンプトで、次のように入力します。

    aspnet_regiis.exe -i

    次の図に、スクリプト マップを更新する様子を示します。

    図 8. スクリプト マップを更新する

    aspnet_regiis の実行

Web サービスを作成する

Web サービスを作成するには

  1. Web サービスを収容するディレクトリ C:\MyWebService を作成します。これと異なるディレクトリを使用する場合は、この手順を適宜変更する必要があります。

  2. Visual Studio 2010 (または Visual Studio 2008) を開始します。

  3. [ファイル] メニューの [新規作成] を選択し、[プロジェクト] をクリックします。インストールされているテンプレート カテゴリとして、[WCF] を選択します。テンプレートとして、[WCF サービス アプリケーション] を選択します。[.NET Framework 3.5] をターゲットにします。プロジェクトの場所は、ステップ 1 で作成したディレクトリを参照して指定します。プロジェクトの名前は、CustomersService とします。ソリューションのディレクトリは作成しないでください。次の図に、[新しいプロジェクト] ダイアログ ボックスを示します。

    図 9. [新しいプロジェクト] ダイアログ ボックス

    [新しいプロジェクト] ダイアログ ボックス

    注意

    ターゲットを .NET Framework 3.5 に変更することを忘れないでください。Visual Studio の既定のターゲットは .NET Framework 4 なので、これを .NET Framework 3.5 に変更しないと、この手順はうまくいきません。

  4. プロジェクト内で、名前を IService1.cs から ICustomers.cs に変更します。Visual Studio 2010 は、このプロジェクト内のコード要素 IService1 に対するすべての参照の名前を変更するか質問してきます。[はい] をクリックします。実際には、すべてのモジュールのすべてのコードを置き換えるので、[はい] と [いいえ] のどちらをクリックしても影響はありません。

  5. プロジェクト内で、名前を Service1.svc から Customers.svc に変更します。次の図に、これらのアイテムの名前を変更した後のソリューション エクスプローラーを示します。

    図 10. アイテムの名前を変更した後のソリューション エクスプローラー

    アイテム名を変更後のソリューション エクスプローラー

  6. Customers.svc を次の 1 行のマークアップに置き換えます。Customers.svc右クリックし、[マークアップの表示] を選択します。この記事のマークアップをコピーし、Visual Studio に貼り付け、保存します。

    <%@ ServiceHost Language="C#" Debug="true" Service="CustomersService.Customers" CodeBehind="Customers.svc.cs" %>
    
  7. Customers.svc.cs を以下のコードに置き換えます。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace CustomersService
    {
        public class Customers : ICustomers
        {
            // Finder
            public List<Customer> GetAllCustomers()
            {
                return new List<Customer>()
                {
                    new Customer
                    {
                        CustomerID = 1,
                        CustomerName = "Bob",
                    },
                    new Customer
                    {
                        CustomerID = 2,
                        CustomerName = "Bill",
                    },
                    new Customer
                    {
                        CustomerID = 3,
                        CustomerName = "Cheryl",
                    },
                };
            }
    
            // Specific finder
            public Customer GetCustomerByID(int CustomerID)
            {
                return GetAllCustomers().FirstOrDefault(c => c.CustomerID == CustomerID);
            }
        }
    }
    
  8. ICustomers.cs を以下のコードに置き換えます。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    
    namespace CustomersService
    {
        [ServiceContract]
        public interface ICustomers
        {
            [OperationContract] //finder
            List<Customer> GetAllCustomers();
    
            [OperationContract] //specificFinder
            Customer GetCustomerByID(int CustomerID);
        }
    
        [DataContract]
        public class Customer
        {
            [DataMember]
            public int CustomerID { get; set; }
    
            [DataMember]
            public string CustomerName { get; set; }
        }
    }
    
  9. Web.config を次のマークアップに置き換えます。ソリューション エクスプローラーで、Web.config を右クリックし、[編集] を選択します。その後、マークアップをコピーし、貼り付け、保存します。

    重要なメモ重要

    これは、この特定の Web サービスを構成する Web.config ファイルです。このファイルがある場所は C:\MyWebService\CustomersServiceです。

    <?xml version="1.0"?>
    <configuration>
      <system.serviceModel>
        <services>
          <service behaviorConfiguration="CustomersService.Service1Behavior"
            name="CustomersService.Customers">
            <endpoint address="" binding="wsHttpBinding" contract="CustomersService.ICustomers">
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="CustomersService.Service1Behavior">
              <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deploying the solution. -->
              <serviceMetadata httpGetEnabled="true"/>
              <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deploying the solution to avoid disclosing exception information. -->
              <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>
    
  10. アプリケーションをビルドします。

  11. アプリケーションを既定の Web サイトに追加します。インターネット インフォメーション サービス (IIS) マネージャー を開始します。[スタート] ボタンをクリックし、[すべてのプログラム]、[管理ツール]、[インターネット インフォメーション サービス (IIS) マネージャー] の順に選択します。[インターネット インフォメーション サービス (IIS) マネージャー] で [サイト] を展開し、[既定の Web サイト] を右クリックし、[アプリケーションの追加] を選択します。次の図に、[インターネット インフォメーション サービス (IIS) マネージャー] でアプリケーションを追加する様子を示します。

    図 11. インターネット インフォメーション サービス

    インターネット インフォメーション サービス マネージャー

    [アプリケーションの追加] ダイアログ ボックスの [エイリアス] フィールドに「Customers」と入力します。[物理パス] フィールドは、 C:\MyWebService\CustomersServiceを参照して指定します。[OK] を 2 回クリックします。次の図に、この Web サービスのディレクトリを示します。

    図 12. Web サービスのディレクトリ

    Web サービスが含まれるディレクトリを参照する

  12. Web サービスが動作していることを確認します。Internet Explorer を開始し、 https://localhost/Customers/Customers.svcにアクセスします。Web サービスが動作していれば、次のように表示されます。

    図 13. Internet Explorer での CustomersService Web サービスの表示

    Internet Explorer で実行されている Web サービス

Web サービスを検証する

Web サービスをテストするには、WCF テスト クライアントを使用する方法もあります。

WCF テスト クライアントを使用して Web サービスを検証するには

  1. Visual Studio コマンド プロンプトを開始します (または、前の手順の最後に開いたコマンド プロンプトを使用します)。

  2. 「 wcftestclient 」と入力して WCF テスト クライアントを実行します。[File] メニューの [サービスの追加] を選択します。

  3. エンドポイント アドレスとして「 https://localhost/Customers/Customers.svc 」と入力し、[OK] をクリックします。

    次の図は、WCF テスト クライアントにエンドポイントを入力する方法を示しています。

    図 14. WCF テスト クライアント

    WCF テスト クライアント

    サービスが正常に追加されていれば、サービスで公開しているメソッドが表示されます。次の図に、WCF テスト クライアントの Web サービス メソッドを示します。

    図 15. WCF テスト クライアントによるメソッドの表示

    メソッドが表示される WCF テスト クライアント

  4. [GetAllCustomers] をダブルクリックします。ウィンドウが表示され、そこでリクエストを構成して実行できます。

  5. [呼び出し] をクリックして Web サービスからの応答を表示します。次の図は、GetAllCustomers を呼び出して得られた結果です。

    図 16. WCF テスト クライアントで GetAllCustomers を呼び出したときの結果

    データが表示される WCF テスト クライアント

まとめ

この記事では、クレーム対応の Web サービスを作成して Business Connectivity Services で使用するまでの全 4 工程の最初の工程を実行しました。具体的には、Web サービスを作成し、コンパイルし、IIS を使用してホストしました。次の記事 WCF: WCF Web サービス内で呼び出し元の ID を確認する (パート 2/4) では、このサンプルを拡張して、Web サービスの呼び出し元の本人確認を行う Windows Identity Foundation (WIF) の機能を使用するようにします。

その他の技術情報