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

最終更新日: 2010年7月7日

適用対象: SharePoint Foundation 2010

この記事の内容
ASP.NET Web サービス作成の基本手順
Visual Studio で ASP.NET Web サービスを作成する
静的探索ファイルおよび WSDL ファイルを生成および変更する
Web サービス ファイルを _vti_bin ディレクトリに展開する
新しい Web サービスを spdisco.aspx に登録する
Web サービスを使用する Windows アプリケーションを作成する
SharePoint Foundation オブジェクト モデルを実装する

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

重要重要

カスタム ASP.NET Web サービスは SharePoint Foundation 2010 で機能しますが、それよりもカスタム WCF サービスを作成することをお勧めします。WCF サービスの詳細については、「SharePoint Foundation 2010 の WCF サービス」を参照してください。カスタム WCF サービスを作成する具体的な手順については、「[チュートリアル] SharePoint Foundation でカスタム WCF サービスの作成と実装を行う」を参照してください。

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

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

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

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

  • Spdisco.aspx に登録して、Web サービスを探索可能にします。

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

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

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

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

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

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

  2. [新しい Web サイト] ダイアログ ボックスでターゲット フレームワークとして [.NET Framework 3.5] を選択し、[インストールされているテンプレート] でプログラミング言語として [Visual Basic] または [Visual C#] を選択して [ASP.NET Web サービス] テンプレートを選択します。次に、[Web 上の場所] ボックスで [ファイル システム] を選択し、プロジェクトの場所を指定して、[OK] をクリックします。

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

  4. [新しいプロジェクト] ダイアログ ボックスの [インストールされているテンプレート] ボックスで [Visual Basic] または [Visual C#] のどちらかを展開し、テンプレートとして [クラス ライブラリ] を選択して、プロジェクトの名前と場所を指定します。次に、[ソリューション] ボックスで [ソリューションに追加] を選択して、[OK] をクリックします。

  5. クラス ライブラリ プロジェクトに System.Web.Services 名前空間への参照を追加します。ソリューション エクスプローラーでプロジェクトを右クリックして [参照の追加] をクリックし、[参照の追加] ダイアログ ボックスの [.NET] タブで [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 2.0 Software Development Kit のインストールに含まれているコマンド ライン ユーティリティ gacutil.exe を使用します。

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

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

    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 ファイルを作成する必要があります。SharePoint Foundation は URL を仮想化するので (たとえば、http://MyServer/MySite/MySubsite は http://MyServer となる)、ASP.NET が自動生成する .disco ファイルと .wsdl ファイルは使用できません。代わりに .disco ページと .wsdl ASPX ページを作成し、それで必要なリダイレクション機構を提供して仮想化を維持する必要があります。

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

静的探索ファイルと WSDL ファイルを生成して編集するには

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

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

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

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

    <%@ Page Language="C#" Inherits="System.Web.UI.Page" %> 
    <%@ Assembly Name="Microsoft.SharePoint, Version=14.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) で変更し、サービスを SharePoint Foundation で探索できるようにします。

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

_vti_bin 仮想ディレクトリは %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI ディレクトリに物理的にマップされます。このディレクトリには、SharePoint Foundation で使用される既定の Web サービス ファイルが格納されています。新しい MyCustomWebServicewsdl.aspx ファイルと MyCustomWebServicedisco.aspx ファイル、さらに MyCustomWebService.asmx ファイルを ISAPI フォルダーにコピーします。

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

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

新しい Web サービスを spdisco.aspx に登録する

作成した Web サービスが、Visual Studio で既定の SharePoint Foundation Web サービスと同様に Web サービスとして探索されるようにするには、%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\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 を開き、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

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

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

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

  5. [サービス参照の追加] ダイアログ ボックスで [詳細設定] をクリックし、[サービス参照設定] ボックスで [Web 参照の追加] をクリックします。

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

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

    Enter キーを押します。

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

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

  9. [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());
    
  10. F5 キーを押して、プロジェクトをコンパイルして実行します。メッセージ ボックスに "Hello World" と表示されます。

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

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

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

  1. Microsoft.SharePoint アセンブリへの参照を追加します。ソリューション エクスプローラーでクラス ライブラリ プロジェクトを右クリックし、[参照の追加] をクリックして [SharePoint Foundation] を選択してから、[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.");
    

    注意

    コードで HttpGet 要求の処理中に SharePoint Foundation データを変更する場合、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 サイトに存在するリストの数が表示されます。