豊田 孝

 前回までは,Webサービスの構造やその作り方を学習してきました。今回は,前回作成したWebサービスを利用するプログラムを作成します。Webサービスを利用するプログラムは,一般には,クライアント・プログラムなどと呼ばれています。なお,利用するWebサービスについては,前回記事を参照してください。

 前回も説明したように,Webサービスはインターネットに公開されるクラスです。インターネットにはさまざまなOSプラットフォームとその環境で動作するクライアント・プログラムが存在しますから,Webサービス・クラスは標準言語であるWeb Service Description Language(WSDL)で表現します。

 Webサービス・クライアントの作成手順を整理すれば,次のようになります。

ステップ1:WSDL定義情報を入手する
ステップ2:WSDL定義情報を使用するプログラミング言語のクラス情報に変換する
ステップ3:クライアント・ソース・コードを記述する
ステップ4:クライアント・ソース・コードをコンパイルし,実行する

 ご覧のように,クライアント作成手順は,Webサービス作成手順とほぼ逆順になります。

 本日は,WSDL定義情報のクラス情報への変換を中心に解説します。

WSDL定義情報のクラス情報への変換

 WSDLはWebサービスを定義する業界標準言語ですから,平均的なソフトウエア開発者がWSDL言語仕様を詳細に学習する必要はありません。ふだん使用している開発環境やインターネットで公開されているツールを使用するのが一般的でしょう。ここでは,.NETフレームワークに付属するWSDL.EXEユーティリティを使用します。このユーティリティはコマンドライン・プログラムで,例えば,次のように使用します。

wsdl /protocol: soap /namespace:Itpro.Toyota.No8cs /language: cs /out:wscs.cs http://localhost/itprowsc/AdvancedNo7cs.asmx

wsdl /protocol: HttpPost /namespace:Itpro.Toyota.No8vb /language: cs /out:wsvb.cs http://localhost/itprowsc/AdvancedNo7vb.asmx

 スラッシュ(/)から始まるデータは,WSDLユーティリティに渡すオプション引数です。この例では,次の4種類の引数が使われています。

/protocol:
/namaspace:
/language:
/out:

 WSDLコマンドを実行すると,WSDLユーティリティは,指定したインターネット資源からWSDL定義情報を読み込み,wscs.csとwsvb.csという2つのソース・ファイルを作成します。ここで注意していただきたいのは,wsvb.csファイルは,Visual Basic .NET言語で記述されたWebサービス・クラス情報(AdvancedNo7vb.asmx)を含みます。つまり,Visual Basic .NETクラスは,WSDL言語経由で,Visual C# .NETクラスに表現し直されるのです。これは言語間の壁を越える.NETの特徴の1つです。また,/protocol引数を見ると分かるように,この例では,SOAPとHttpPostという2種類の異なるプロトコルを使用しています。

 以上の内容を整理すれば,クライアント開発者は,WSDLユーティリティに各種の引数を渡すことにより,通信プロトコルやプログラミング言語を自由に選択できるようになっている,といえます。

 以上でWebサービス・クラスに関する情報は取得できましたから,今度は,クライアント・コードを作成します。

Webサービス・クライアント・コードの作成

 クライアント・コード内では,wscs.csとwsvb.csという2つのソース・コード内に含まれるWebサービス・クラスのインスタンスを作成し,そのインスタンス・メソッドを呼び出します。インスタンスというのは,ここではクラス(設計図)を基に確保されるメモリー(建物)と考えてください。これは通常のクラス・プログラミングです。プログラミング例をリスト1に示します。

リスト1●クラス・プログラミングの例
using System;
using Itpro.Toyota.No8cs;
using Itpro.Toyota.No8vb;

namespace Itpro.Toyota.ClientClasses
{
class No8ClientClass
{
public static void Main()
  {
  No7ServiceCS wsc = new No7ServiceCS();
   No7ServiceVB wsvb = new No7ServiceVB();
   Console.WriteLine(wsc.MyWebService());
   Console.WriteLine(wsvb.MyWebService());
   Console.ReadLine();
  }
}
}

 このクライアント・コードでは,usingステートメントを使って3個の名前空間をインポートしています。

 usingステートメントは,Visual Basic .NETのImportsに相当し,C#言語の固有の命令です。また、名前空間というのはクラス名の一意性を保証する空間です。ここではItpro.Toyota.No8csとItpro.Toyota.No8vbという2つの名前空間をインポートしていますが,これらはWSDLユーティリティの/namaespaceオプションで指定したものです。つまり,私たちが自由に指定できるのです。

 ここでMainメソッド・コードに注目してください。通信プロトコルやURLアドレスなどのインターネット関連情報は表面に出ていません。これは,情報が隠ぺいされていることを示しています。この情報隠ぺいでは,クラス継承とコンストラクタが重要な意味を果たしています。コンストラクタは,ここではクラスのインスタンスがメモリー上に作成されるときに同時に実行されるメソッドの別名と考えてください。ちなみに,Webサービス・クライアント・コードでは、利用するWebサービスのURLを設定しています。より詳細に興味のある方は,WSDLユーティリティが作成するソース・ファイルの内容を検討してみるとよいでしょう。

 Webサービスを利用するソース・コードができましたから,後はコンパイルするだけです。

図1●サンプル・プログラムの実行結果

クライアント・ソース・コードのコンパイル

 .NETフレームワークをインストールすると,Visual C# .NETとVisual Basic .NET用のコマンドライン・コンパイラが利用できるようになります。Webサービス・クライアントをVisual C# .NETで記述している場合には,次のようにC#コンパイラを実行します。

csc /doc:itprotoyota.xml /out:itprono8.exe /target:exe /warnaserror+ wscs.cs wsvb.cs itproclient.cs

 このコマンドが実行されると,itprono8.exeとitprotoyota.xmlという2つのファイルが作成されます。itprono8.exeは,実行プログラムです。一方,itprotoyota.xmlは,itprono8.exeに関する情報を含むXMLドキュメント・ファイルです。図1[拡大表示]に,筆者環境での実行結果を示します(テスト用に匿名アクセスを許可した状態)。前回作成したWebサービスにより,ユーザー・エージェントが表示されます。

 本日は以上で終了です。次回またお会いいたしましょう。ごきげんよう!