豊田 孝

 前回は単純なWebサービスを作成し,ASP .NETのテスト環境で動作させ,HTTP,SOAP,XMLなどの各種標準プロトコルの存在とその役割を確認しました。標準プロトコルは,基本的にはデータ交換を支えるインフラですから,私たちはその存在をそれほど意識する必要はありません。

 今回は,Webサービスを支えるクラスを取り上げます。クラスは,いわば交換されるデータを定義しますから,意識する必要がない,というわけにはいきません。Webサービスは,基本的に,次のような3つのクラスに支えられています。

  • WebServiceクラス
  • WebServiceAttributeクラス
  • WebMetodAttributeクラス

 今回は,これら3つのクラスのうちの,WebServiceAttributeクラスとWebMetodAttributeクラスについて説明します。WebServiceクラスの説明は,次回以降に説明する予定です。それではさっそく,本論に入りましょう。

Webサービス入門者が直面する基本的な問題

 WebServiceAttributeクラスは,System.Web.WebServices名前空間に存在するクラスの1つです。このクラスは,専門書などでは,インターネットに公開するWebサービス・クラスの属性を設定するために使用される,と表現されています。

 WebMethodAttributeクラスもまた,System.Web.WebServices名前空間に所属し,Webサービス・クラス内に定義・実装されているメソッドの属性を設定するために使用される,と言われています。

“Webサービス・クラスに属性を設定する”や“Webサービス・メソッドの属性を設定する”などの表現は,どう見ても,Webサービス入門者の理解の範囲を超えています。そこで本日は,この表現の意味を具体的なサンプル・プログラムを通して考えてみることにします。

サンプル・プログラムのダウンロード

 今回は,時間のあるときの独習用に役立ててもらいたいと考え,次のような6種類のサンプル・プログラムを用意しました。

  • SimpleNo5cs.asmx
  • SimpleNo5vb.asmx
  • WebSeviceMonitorNo5.hta
  • Test.vbs
  • AdvancedNo5cs.asmx
  • AdvancedNo5vb.asmx

 最初の2つのサンプル・プログラムは,Visual C# .NETとVisual Basic .NETで記述した単純なWebサービス・プログラムです。WebServiceMonitorNo5.htaは第4回で紹介した簡易モニター・プログラムの改定版です。

 Test.vbsはテスト動作を効率化するためのプログラムです。このテスト動作効率化プログラムはマウスでダブルクリックするだけで起動しますが,使用する際にはソース・コード内のコメントに目を通してください。

 また,AdvancedNo5cs.asmxとAdvancedNo5vb.asmxの活用法については,後の方で説明します。

 これら6種類のサンプル・プログラムはこちらからダウンロードできるようにしてあります。なお,仮想ディレクトリの作成手順やWebサービスのテスト呼び出し手順などを忘れてしまった方は,第3回を復習してください。

クラス属性設定の意味を考えてみる

 まずは,クラス属性設定の意味を考えてみます。サンプル・プログラム内では,リスト1リスト2のように,クラス属性が設定されています。

 ご覧のように,Visual C# .NETコードとVisual Basic .NETコードには,ほとんど違いはありません。これは,WebServiceAttributeという.NETフレームワークが用意している共通のクラスを使用しているからです。共通のクラスを使用するということは,このように,プログラミング言語間の相違を吸収するという利点があります。これらのコードは,リスト1,リスト2のようにそれぞれ単純化して記述することができます。

 リスト1,リスト2では,WebServiceAttributeクラスがWebServiceという具合に,Attribute部分を省略して記述されています。このような簡略記述は,経験豊富な開発者にはそれなりに意味のあることですが,Webサービス初心者がこのようなコードを見た場合,WebServiceAttributeクラスとWebServiceクラスを区別できず,混乱してしまう可能性があります。このため今回は,簡略記述ではなく,リスト3リスト4のように完全なクラス名を使用します。

 これらの2つのコード内では,前回紹介したNamespaceやDescription,Nameなどの3種類の属性が設定されています。皆さんの中には,Namespaceなどの属性はそもそも何なのかという疑問を持った方もいるかと思います。回答を言ってしまうと,これらの属性は,WebServiceAttributeクラスのプロパティです。

 WebServiceAttributeクラスは,次のような3種類の独自プロパティを持っています。

  • Descriptionプロパティ
    クラスの説明情報を管理し,WSDLでは,Documentationタグとなる
  • Namespaceプロパティ
    クラス名の一意性を確保する名前空間名を管理する
  • Nameプロパティ
    クラス名を管理し,WSDLでは,ServiceタグのName要素になる

 これら3種類のプロパティは,それぞれのプロパティの意味と役割が簡単に想像できるような,分かりやすい名前を持っています。Webサービス・クラスに属性を設定するということを一言でいえば,WebServiceAttributeクラスのプロパティに独自の値を設定するということです。後日時間のあるときに,サンプル・コード内の各種設定を変更し,いろいろ試してみてください。

 プロパティ名から想像できるように,Webサービス・プログラミングの入門者が自由に変更しても,深刻な問題は発生しません。なお,WebServiceAtributeクラスは,System.Attributeというクラスを基に作成されていますから(このようなクラス作成方法をクラス継承といいます),これ以外のプロパティとメソッドも持っています。

メソッド属性設定の意味を考えてみる

 ここでは,メソッド属性設定の意味を考えます。サンプル・プログラム内では,リスト5リスト6のようなメソッド属性設定コードが使われています。

 ご覧のように,2つの言語間の相違はほとんどありません。メソッド属性は,メソッド名(正確には,シグネチャ)の直前に記述されています。このメソッドの機能は前回説明しましたので,今回は省略します。

 WebMethodAttributeクラスは,WebServiceAttributeクラスと同じように,Attribute部分を省略して記述することができます。しかし,本連載ではWebServiceAttributeクラス記述に合わせて,完全なクラス名を使用することにします。

 これらのコードでは,BufferResponse,CacheDuration,Descriptionなどの3種類の属性が設定されています。このような属性は,クラス属性と同じように,WebMethodAttributeクラスのプロパティです。

図1●サンプル・プログラムを呼び出した画面
図2●MessageNameプロパティ
図3●AdvancedNo5cs.asmxの実行画面(その1)
図4●AdvancedNo5cs.asmxの実行画面(その2)
 WebMethodAttributeクラスは,7種類の独自プロパティを持っていますが,今回は次の2種類のプロパティを説明します。また,WebMethodAttributeクラスは,WebServiceAtributeクラスと同じように,System.Attributeクラスから作成されていますから,他のプロパティやメソッドも持っています。

  • Descriptionプロパティ
    メソッドの説明情報を管理し,WSDLでは,Documentationタグとなる
  • MessageNameプロパティ
    Webメソッド名の別名を管理し,WSDLでは,MessageタグのName要素となる

 メソッド属性を設定するということは,簡単に言えば,WebMethodAttributeクラスのプロパティに希望する値を設定することです。

 ところで皆さん,MessageNameというプロパティ名称からどのような印象を受けますか?前回触れたように,メソッドは「操作」とも表現されます。MessageNameというプロパティはいったい何を伝えようとしているのでしょうか?メソッドは単純にMessageを意味するのでしょうか?客観的に見て,このメソッド名はWebサービス初心者には分かりにくいと思われます。

 サンプル・プログラムSimpleNo5cs.asmxを呼び出してみると,図1[拡大表示]のような画面が表示されてきます。

 この画面から分かるように,このWebサービス・クラスは,3つのメソッドをインターネットに公開しています。ソース・コードを見るとわかりますが,3つのメソッドは同じ名前を持っています。複数のメソッドが同じ名前を持っていたのでは問題が発生してしまいますから,MessageNameプロパティに異なる値を設定し,異なる名称を持つメソッドとして公開しています。オブジェクト指向の参考図書などを読んでいると,“オブジェクトにメッセージを送る”などの表現に出会うと思います。そして,“それは,そのオブジェクトのメソッドを呼び出すことである”,などの説明が載っていると思います。MessageNameというプロパティ命名の背景には,このようなオブジェクト指向への傾斜があると考えるとわかりやすいかもしれません。ちなみに,WSDLでは,図2[拡大表示]のように表現されています。

設定されたクラス/メソッド属性を表示してみる

 今回用意したAdvancedNo5cs.asmxとAdvancedNo5vb.asmxを使用すると,WebサービスクラスとWebサービスメソッドに設定した属性を表示させることができます。例えば,AdvancedNo5cs.asmxを実行すると,図3[拡大表示],図4[拡大表示]のような画面が表示されます。

 Visual C# .NETコードとVisual Basic .NETコードのちょっとしたコーディングの違いなども学習できるようなプログラムにしましたので,後日時間のあるときに参考にしてください。

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