カスタム Web サービスを作成する

このプログラミング タスクでは、Windows SharePoint Services 3.0 のコンテキスト内で動作するカスタム Web サービスの作成方法の概要を示します。単純な "Hello World" Web サービスの作成手順を示し、サービスを変更して、サイトおよびリスト データを返す Windows SharePoint Services 3.0 サーバー側オブジェクト モデルを実装する方法を示します。

Web サービス作成の基本手順

  • Microsoft Visual Studio 2005 で ASP.NET Web サービスを作成します。

  • Web サービスのプログラミング ロジックを定義する Web サービス内にクラス ライブラリを作成します。

  • 静的探索ファイルおよび Web Services Description Language (WSDL) ファイルを生成し、編集します。

  • Web サービス ファイルを _vti_bin ディレクトリに展開します。

  • Web サービスを使用するクライアント アプリケーションを作成します。

Visual Studio で ASP.NET Web サービスを作成する

最初に、Visual Studio 2005 で ASP.NET Web サービス Web サイトを作成します。

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

  1. Visual Studio で [ファイル] メニューの [新規作成] をポイントし、[Web サイト] を選択します。

  2. [新しい Web サイト] ダイアログ ボックスの [テンプレート] ボックスで [ASP.NET Web サービス] を選択し、[場所] ボックスで [ファイル システム] を選択します。プログラミング言語とプロジェクトの場所を選択し、[OK] をクリックします。

  3. Web サービス ソリューション内で、Web サービス ロジックを格納する単独のクラス ライブラリ プロジェクトを作成します。プロジェクトを作成するには、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] を選択します。

  4. [新しいプロジェクト] ダイアログ ボックスの [プロジェクトの種類] ボックスで言語を選択し、[テンプレート] ボックスで [クラス ライブラリ] を選択してプロジェクトの名前と場所を指定し、[ソリューション] ボックスの [ソリューションに追加] を選択して、[OK] をクリックします。

  5. クラス ライブラリ プロジェクトに System.Web.Services 名前空間への参照を追加します。[ソリューション エクスプローラ] でプロジェクトを右クリックし、[参照の追加] をクリックして、[参照の追加] ダイアログ ボックスで [System.Web.Services] を選択して、[OK] をクリックします。

  6. クラス ライブラリ プロジェクト内の既定のクラス ファイルを、Visual Studio によって Web サービスの App_Code フォルダに格納された既定のサービス クラス ファイルに置き換えます。

    クラス ファイルを サービス クラス ファイルに置き換えるには

    1. [ソリューション エクスプローラ] で、Service.cs または Service.vb をクラス ライブラリ プロジェクトの最上位ノードにドラッグします。

    2. Class1.cs ファイルまたは Class.vb ファイルと App_Code フォルダに残っている Service.cs ファイルまたは Service.vb ファイルを削除します。

  7. クラス ライブラリに厳密な名前を作成する

    1. [ソリューション エクスプローラ] でクラス ライブラリ プロジェクトを右クリックし、[プロパティ] をクリックします。

    2. [プロパティ] ダイアログ ボックスで [署名] をクリックし、[アセンブリの署名] を選択して、[厳密な名前のキー ファイルを選択してください] リストで [<新規作成>] を選択します。

    3. [厳密な名前キーの作成] ダイアログ ボックスでキーのファイル名を指定し、[キー ファイルをパスワードで保護する] チェック ボックスをオフにして、[OK] をクリックします。

  8. クラス ライブラリ プロジェクトのみをビルドするには、[ソリューション エクスプローラ] でプロジェクトを右クリックし、[ビルド] をクリックします。

  9. アセンブリをグローバル アセンブリ キャッシュ (GAC) に追加するには、Windows エクスプローラの 2 つのインスタンスを使用して %windows%\assembly ディレクトリにアセンブリをドラッグするか、Microsoft .NET Framework SDK 2.0 のインストールに含まれているコマンド ライン ユーティリティ gacutil.exe を使用します。

    gacutil.exe を使用してクラス ライブラリ DLL を GAC にコピーするには

    1. Visual Studio コマンド プロンプトを開いて [スタート] をクリックし、[すべてのプログラム]、[Microsoft Visual Studio 2005]、[Visual Studio ツール] の順にポイントして、[Visual Studio 2005 コマンド プロンプト] をクリックします。

    2. コマンド プロンプトで、次の形式でコマンドを入力し、Enter キーを押します。

      gacutil.exe -if "<Full file system path to DLL>".

  10. これで Web サービスの既定の Service.asmx ファイルのアセンブリ情報を GAC からの DLL の情報に変更する準備ができました。GAC から情報を取得するには、Windows エクスプローラの %windows%\assembly ディレクトリでアセンブリを右クリックし、[プロパティ] をクリックします。

  11. Service.asmx を [ソリューション エクスプローラ] で開くには、ファイルを右クリックして [開く] をクリックします。

  12. Service.asmx のページ ディレクティブから CodeBehind 属性を削除し、Class 属性のコンテンツを変更して、ディレクティブを次の形式に一致させます。ここで、アセンブリ名 "MyServiceAssembly" と公開キー トークンは、手順 10. で開いた [プロパティ] ダイアログ ボックスで指定した値です。

    <%@ WebService Language="C#" Class="Service, MyServiceAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8f2dca3c0f2d0131" %>
    

    Visual Basic では、クラスを識別するために、名前空間を含めます (たとえば、Class="MyServiceNamespace.Service, MyServiceAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8f2dca3c0f2d0131")。

  13. 必要に応じて .asmx ファイルの名前を変更し、変更を保存します。

静的探索ファイルおよび WSDL ファイルを生成および変更する

カスタム Web サービスの探索機構および説明を指定するには, .disco ファイルと .wsdl ファイルを作成する必要があります。Windows SharePoint Services は URL を仮想化するため (例 : http://MyServer/MySite/MySubsite は http://MyServer になります)、ASP.NET で自動生成される .disco ファイルおよび .wsdl ファイルを使用できません。代わりに、必要なリダイレクションを指定し、仮想化を維持する .disco ページおよび .wsdl ASPX ページを作成する必要があります。

ASP.NET を使用して .disco ファイルおよび .wsdl ファイルを生成する場合は、/_layouts などの仮想ディレクトリ内の Web サービスを一時的にホストし, .NET Framework Web サービス探索ツール (Disco.exe) を使用して、生成したファイルを取得します。

静的探索ファイルおよび WSDL ファイルを生成するには

  1. Windows エクスプローラで、Web サービスの .asmx ファイルを \\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS にコピーします。

  2. コマンド プロンプトで LAYOUTS から Disco.exe を実行して .disco ファイルおよび .wsdl ファイルを生成します。\LAYOUTS にこれらのファイルを生成するコマンドを実行する際は、次の形式に従ってください。

    disco http://MyServer/_layouts/MyCustomWebService.asmx

  3. Windows SharePoint Services オブジェクト モデルの名前空間を登録するには, .disco ファイルと .wsdl ファイルを開き、冒頭の XML 処理命令 (<?xml version="1.0" encoding="utf-8"?>) をたとえば次のように変更します。

    <%@ Page Language="C#" Inherits="System.Web.UI.Page" %> 
    <%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> 
    <%@ Import Namespace="Microsoft.SharePoint.Utilities" %> 
    <%@ Import Namespace="Microsoft.SharePoint" %>
    <% Response.ContentType = "text/xml"; %>
    
  4. .disco ファイルでコントラクトの参照および SOAP アドレス タグを次の例のように変更します。これによってリテラル パスが Microsoft.SharePoint.Utilities.SPHttpUtility クラスを使用してコードで生成されたパスに置き換えられ、binding 属性で指定したメソッド名も置き換えられます。

    <contractRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request) + "?wsdl"),Response.Output); %> 
    docRef=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> 
    xmlns="https://schemas.xmlsoap.org/disco/scl/" />
    <soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> 
    xmlns:q1="http://tempuri.org/" binding="q1:HelloWorld" xmlns="https://schemas.xmlsoap.org/disco/soap/" />
    <soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> 
    xmlns:q2="http://tempuri.org/" binding="q2:ServiceSoap12" xmlns="https://schemas.xmlsoap.org/disco/soap/" />
    
  5. .wsdl ファイル内に指定された SOAP アドレスも同様に次のように変更します。

    <soap:address location=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> />
    
  6. 2 つのファイルの名前をそれぞれの形式 (MyCustomWebServicedisco.aspx および MyCustomWebServicewsdl.aspx) で変更し、サービスを Windows SharePoint Services で探索できるようにします。

Web サービス ファイルを _vti_bin ディレクトリにコピーする

_vti_bin 仮想ディレクトリは ローカル ドライブ:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI ディレクトリに物理的にマップされます。このディレクトリには Windows SharePoint Services で使用される既定の Web サービス ファイルが格納されています。新しい MyCustomWebServicewsdl.aspx ファイルと MyCustomWebServicedisco.aspx ファイル、および MyCustomWebService.asmx ファイルを ISAPI フォルダにコピーします。

Web サービスは、サービスの Web 参照を追加するときに指定されるサイトに _vti_bin ディレクトリから機能を提供します。

カスタム Web サービスが探索可能かどうかを確認するには、http://MyServer/_vti_bin/MyCustomWebService.asmx に移動します。

新しい Web サービスのリストを spdisco.aspx に追加する

既定の Windows SharePoint Services Web サービス以外のカスタム Web サービスを Visual Studio で Web サービスとして探索できるようにするには、\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI にある spdisco.aspx ファイルを開いて次のコードを追加し、対象 Web サービスの .asmx ファイルを指定します。

<contractRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/MyCustomWebService.asmx?wsdl"), Response.Output); %> 
docRef=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/MyCustomWebService.asmx"), Response.Output); %> 
xmlns=" https://schemas.xmlsoap.org/disco/scl/ " />
<discoveryRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/MyCustomWebService.asmx?disco"),Response.Output); %> 
xmlns="https://schemas.xmlsoap.org/disco/" />

Web サービスを使用する Windows アプリケーションを作成する

Web サービス ファイルを _vti_bin ディレクトリにコピーしたら、次に、その Web サービスを使用する Windows アプリケーションを作成します。

Web サービスを使用する Windows アプリケーションを作成するには

  1. Visual Studio 2005 を開き、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

  2. [新しいプロジェクト] ダイアログ ボックスで、[Visual C#] または [Visual Basic] を選択し、[Windows アプリケーション] テンプレートを選択します。

  3. [名前] ボックスにアプリケーションの名前を入力し、[場所] ボックスにプロジェクト ファイルの場所を指定して、[OK] をクリックします。

  4. [ソリューション エクスプローラ] でプロジェクトを右クリックし、[Web 参照の追加] をクリックします。

  5. [Web 参照の追加] ブラウザのアドレス バーにサービスの適用対象のサイトの URL を以下の形式で入力し、Enter キーを押します。

    https://Server_Name/[sites/][Site_Name/]_vti_bin/MyCustomWebService.asmx

  6. [参照の追加] をクリックして、Web サービスのサービス契約をダウンロードします。

  7. デザイン ビューで [Form1] を開き、[ツールボックス] を表示して、1 つのボタンをフォームにドラッグします。

  8. [Form1] 上の [Button1] コントロールをダブルクリックして分離コード ファイルをコード エディタ内に表示し、カスタム メソッドを呼び出す以下のコードを追加します。

    Dim MyCustomService As New Web_Reference_Folder.MyServiceClass()
    MyCustomService.UseDefaultCredentials = True
    MessageBox.Show(MyCustomService.HelloWorld())
    
    Web_Reference_Folder.MyServiceClass MyCustomService = new Web_Reference_Folder.MyServiceClass();
    MyCustomService.UseDefaultCredentials = true;
    MessageBox.Show(MyCustomService.HelloWorld());
    
  9. F5 キーを押して、プロジェクトをコンパイルして実行します。メッセージ ボックスに "Hello World" と表示されます。

Windows SharePoint Services オブジェクト モデルを実装する

これで、Web サービスのクラス ライブラリにある Windows SharePoint Services オブジェクト モデルのデータ型およびメンバを試す準備ができました。

Windows SharePoint Services オブジェクト モデルを実装するには

  1. 参照を Microsoft.SharePoint アセンブリに追加します。[ソリューション エクスプローラ] でクラス ライブラリ プロジェクトを右クリックし、[参照の追加] をクリックして [Windows SharePoint Services] を選択してから、[OK] をクリックします。

  2. プロジェクトの Service.cs ファイルまたは Service.vb ファイルに、オブジェクト モデルの適切な名前空間をインポートする必要があります。たとえば、Microsoft.SharePoint 名前空間と Microsoft.SharePoint.Utilities 名前空間のデータ型およびメンバを使用するには、以下のディレクティブを追加します。

    Imports Microsoft.SharePoint
    Imports Microsoft.SharePoint.Utilities
    
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Utilities;
    
  3. Service.cs または Service.vb のメソッド名を変更します (たとえば、HelloWorld を GetSiteListCount に変更します)。

  4. 次のコードを追加して、Web サイトの名前とその Web サイトに存在するリストの数を表示します。

    Dim myWebSite As SPWeb = SPContext.Current.Web
    Dim lists As SPListCollection = myWebSite.Lists
    
    Return myWebSite.Title + " contains " + lists.Count.ToString() + 
    " lists."
    
    SPWeb myWebSite = SPContext.Current.Web;
    SPListCollection lists = myWebSite.Lists;
    
    return (myWebSite.Title + " contains " + lists.Count.ToString() + 
    " lists.");
    

    注意

    コードで Windows SharePoint Services データを変更する際、場合によっては Web サイト上の安全でない更新を許可する必要があります。このような場合に AllowUnsafeUpdates プロパティを設定します。

  5. クラス ライブラリ DLL を再ビルドして GAC にコピーするには、「ASP.NET Web サービスを作成するには」の手順 8. および手順 9. を繰り返します。

  6. インターネット インフォメーション サービス (IIS) をリセットして、DLL の変更を有効にします。

  7. .disco ファイルおよび .wsdl ファイルの新しいバージョンを生成するには、「静的探索ファイルおよび WSDL ファイルを生成するには」の手順を繰り返します。その際, .disco ファイルのメソッド バインド名は必要に応じて (たとえば GetSiteListCount のように) 変更してください。

  8. MyCustomWebServicedisco.aspx ファイルおよび MyCustomWebServicewsdl.aspx ファイルの新しいバージョンを ISAPI フォルダにコピーします。

  9. 先に作成した Windows アプリケーションを開き、Hello World の例の Web サービス参照を削除して、必要に応じてメソッド名を変更し、変更後の Web サービスに新しい Web 参照を追加します。

  10. F5 キーを押してプロジェクトをコンパイルして実行します。メッセージ ボックスに Web サイト名とその Web サイトに存在するリストの数が表示されます。