豊田 孝

 本日は,Visual Studio .NET(以後VS .NET)のWebサービス開発機能を取り上げ,Webサービス開発時にはどのような知識が要求されるのかを考えてみることにします。

 VS .NETは,Webサービス開発を支援するために,Webサービス・テンプレートという機能を提供しています。テンプレート(Templateのカタカナ)は“パターン”という意味を持っています。Webサービス・テンプレートの実体は,JScriptなどのテキスト・ファイルですから,経験を積めば,比較的簡単にカスタマイズすることができます。

 以前のVisual Studioでは,テンプレートの代わりに,ATL COM AppWizardやMFC AppWizardといった具合に,Wizard(ウィザード)という機能が使われていました。“ウィザード”は,元々は抜きん出た才能を持つ人や男性魔法使いなどの意味を持っています。コンピュータの世界では,スーパー・プログラマを指す愛称として使用されるようです。

図1●.NETでもWizardという用語は残っている
 ウィザードからテンプレートへの名称が変更され,ウィザードという表現が開発環境から消えたような印象を受けますが,実は,これは表面的な変更にすぎません。内部的には図1[拡大表示]のように,Wizardという用語は依然として健在です。表面に出ないだけです。

 ウィザードとテンプレートは,名称は異なりますが,最終的には,“コードを自動生成する”という点では共通しています。それでは,Webサービス・テンプレートの自動生成コードを検討してみましょう。

自動生成されたWebサービスコード

 VS .NETのWebサービス作成支援テンプレート機能は,正式には,「ASP .NET Webサービス」という名称を持っています。Visual C#とVisual Basicプロジェクトの「ASP .NET Webサービス」ウィザードを実行すると,複数のファイルが自動生成されます。その中のファイルの1つは「Service1.asmx」という名称を持ち,デフォルトでは,次のようなコードを含んでいます。なお,拡張子ASMXを持つファイルは,ASP .NET WebアプリケーションにおけるASPXファイルに相当する,つまり,Internet Explorerなどのブラウザから要求されるページ,と考えておいてください。

リスト1●Visual C#プロジェクト・テンプレート自動生成コード
<%@ WebService Language="c#" Codebehind="Service1.asmx.cs"
 Class="ITProWebServiceWizardC#.Service1" %>

リスト2●Visual Basic .NETプロジェクト・テンプレート自動生成コード
<%@ WebService Language="vb" Codebehind="Service1.asmx.vb"
 Class="ITProWebServiceWizardVB.Service1" %>

これら2種類のASMXファイルには,WebService,Language,Codebehind,Classという4種類の文字列が含まれています。専門的には,WebServiceをディレクティブ,残りの3つを属性といいます。2つのコードを比較してみると分かりますが,使用する言語を明示するLanguage属性の値以外に相違点は見当たりません。ここでは,Codebehind属性とその値に注目してください。

 Codebehind(コードビハインド)というのは,Webサービスとして公開するクラスをASMXファイル(つまり,Webページ)とは独立した,別ファイルの内部に定義・実装するプログラミング技術を一般には指しています。この場合,Service1.asmx.csとService1.asmx.vbというファイルが自動作成され,その中に,Webサービスとして公開されるクラスが定義・実装されていることになります。なお,ASMXファイルと同一ファイル内に定義・実装する(つまり,Webページ内にWebサービス・クラスも同時に含めてしまう)プログラミング技法は「インライン・プログラミング」と呼ばれています。

 インラインとコードビハインドという2つのプログラミング技法は第3回と第4回でそれぞれ具体的に説明する予定です。本日は,VS .NETはデフォルトでコードビハインド技法を採用していることに注目しておいてください。

 Class属性は,Webサービスとして公開されるクラス名を明示しています。この場合,公開されるクラスの名称はService1ということになります。Service1の前に“ITProWebServiceWizardC#”や“ITProWebServiceWizardVB”という文字列がありますが,これらはService1クラスが所属する名前空間(プログラミング的には,プロジェクト名が名前空間として採用されます)です。名前空間の意味や役割については,この後で説明することにします。なお,各ファイルの先頭にあるWebService属性は,その名のとおり,このページがWebサービス,つまり,クラスをインターネットに公開することを明示しています。

図2●Visual C#のプロジェクトで自動生成される内容
図3●Visual Basic .NETのプロジェクトで自動生成される内容
 それでは今度は,Webサービス・クラスを定義・実装するファイルの内容を見てみましょう。Visual C#とVisual Basic .NETの両プロジェクトで自動生成される「Service1.asmx.cs」と「Service1.asmx.vb」ファイルの内容は図2[拡大表示],図3[拡大表示]のようになっています。

 本日は,図中の「注目1」と「注目2」の部分を見てみることにします。その他のコードについては,Webサービスやそのクライアントを実際に作成する次回以降で触れることにします。

 注目1コードは次のようになっています。

リスト3●Visual C#コードの注目1
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;

リスト4●Visual Basic .NETコードの注目1
Imports System.Web.Services

 2つのコードには,System.Web.Servicesという共通項目が含まれています。Visual Basic .NETはこれ以外の項目を含んでいません。おそらく皆さんの多くは,これらのコードから,次のような疑問を持つのではないかと思います。

“私たちは今Webサービスを作成しているのだから,System.Web.Servicesというコードが自動生成されることはなんとなく理解できる。しかし,Visual C#ファイル内のSystem.DataやSystem.Diagnosticsといった,Webサービスと直接的な関係があると思われないコードがなぜ自動生成されるのだろうか?”

 この疑問への回答を用意する前に,usingとImportsというコードの意味を説明しておきます。Visual Basic .NETのImportsというコード名称から分かるように,usingとImportsは“何かを港内に入れる”あるいは“何かを輸入する”という意味を含んでいます。.NETの場合,“何か”とは,最終的にはクラスを指します。何のためにクラスを輸入するかといえば,それは,目的のクラスを再利用するためです。

 一部の方はご承知かと思いますが,.NETの世界には7000を超えるクラスが事前定義されています。このクラス数は,技術の進歩やW3Cなどの標準化作業の進捗結果とともに,今後さらに増えることでしょう。usingとImportsがクラスを輸入するためのコードならば,論理的にはプログラム内で新しいクラスが必要になるたびに,usingとImportsコードを記述し,輸入するクラスを明示しなければなりません。例えばプログラム内で1000個のクラスを再利用する場合,論理的には,同数のusingとImportsコードが必要になります。これではタイピング負担が増え,開発効率が落ちてしまいます。実は,usingとImportsは,個々のクラスを明示しているのではなく,そのクラスが所属する“名前空間”というものを指定するためのキーワードなのです。キーワードはプログラミング言語側が用意しますから,採用する言語に応じて当然異なります。

 名前空間というのは,一般には,クラスの名前などの一意性を保証し,名前の衝突を避けるための概念といわれています。このため,概念自体は新しいものではなく,事実,C++から継承しているといわれます。また,Windows 2000やWindows XPなどのシェルもこの概念を採用し,ファイル名の衝突を回避しています(ディレクトリが名前空間となり,各空間内の個々のファイルはオブジェクトという関係になっている)。

 しかしすでに触れたように,.NET世界には7000を超えるクラスが用意されています。名前空間は,数あるクラスを機能的にグループ化し,分かりやすく整理するための手段として重要な意味を持っています。例えばSystem.Dataという名前空間は,データベースを操作するためのクラスの集合を管理していることを示しています。同じように,System.Web.Services名前空間は,Webサービス関連クラス群の所属先空間名となります。

 それではここで,先に紹介した自動生成コードの疑問に戻りましょう。Visual C# .NETプロジェクトの自動生成コードは,Webサービスと直接的な関係がないと思われるSystem.Collections,System.Diagnostics,あるいはSystem.Dataなどの名前空間をいくつか含んでいます。この背景には、次のような2つの事情が考えられます。

  • ドラッグ・アンド・ドロップによるコントロール追加支援と関連コードの自動生成
  • プログラミング・パターンの紹介

 実は,テンプレートには,Weサービス・テンプレートとDesignerテンプレートの2種類が存在します。Designerテンプレートとは,ここでは,ドラッグ・アンド・ドロップ操作を通した,ビジュアルな開発作業を支援するコードを定義したもの,と考えておいてください。

図4●Designerテンプレートの内容
図5●NewWebServiceCode.csというテンプレートが用意されている
 この注目1コード部分は,厳密にはWebサービス・テンプレートではなく,図4[拡大表示]のような事前定義コードを持つ,Designerテンプレート・ファイルの1つを基に自動作成されているのです。参考のために、Visual C#のDesignerテンプレートのディレクトリ構成図を図5[拡大表示]に示しておきます。NewWebServiceCode.csというテンプレートが用意されていることがわかると思います。後日お時間のあるときに、このファイルとVisual Basic .NETのテンプレートファイル(NewWebServiceCode.vb)を比較してみるとよいでしょう。プログラミング言語間の相違やインターフェイス継承とクラス継承などのオブジェクト指向プログラミングテクニックを学ぶ上での参考になるでしょう。

 結論を言えば,VS .NETのような統合開発環境を使用しない場合には,System.Web.Services以外の名前空間の輸入は不要となります。つまり,System.Data名前空間などは,作成するWebサービス内部でデータベース機能が必要になった段階で,輸入すればよいのです。

 それでは次に,注目2コードを見てみましょう。

リスト5●Visual C#コードの注目2
public class Service1 : System.Web.Services.WebService

リスト6●Visual Basic .NETコードの注目2
Public Class Service1 Inherits System.Web.Services.WebService

WebサービスはWebServiceクラスを継承する

 これら2つのコードは,次のように書き換え,単純化することができます。

リスト7●Visual C#コードの注目2
public class Service1 : WebService

リスト8●Visual Basic .NETコードの注目2
Public Class Service1 Inherits WebService

 これら2つのコードの機能上の意味は,まったく同じと考えて問題ありません。Visual C#コードは,C++の文化を引き継ぎながら,コーディング負担を軽減しようとしていることが分かります。一方,Visual Basic .NETコードの方を見てみると,Inheritsという英単語が含まれています。この単語は,辞書を引いてみると,“継承する”という意味を持っています。つまり,Service1というクラス(Webサービス)は,WebServiceというクラスの資産を継承していることを示しているのです。どのような資産を継承しているかなどについては,次回以降で詳しく説明することになっています。

 それではここで,Webサービスを理解するために必要とされる知識を整理しておきます。

“Webサービスを理解するには,System.Web.Services名前空間とその空間に収容されているクラス群に関する知識が必要である”

 次回は単純なWebサービスを作成しながら,Webサービスとは何かを具体的に学習します。それでは次回またお会いいたしましょう。ごきげんよう!