豊田 孝
本連載も最終回を迎えることになりました。第1回では,本連載を最後まで読めば,次のような疑問への回答を見つけることができると申し上げました。
- 「関数」とは何か?
- 「再利用部品」とは何か?
- 「再利用部品を組み合わせる」ということはどういうことなのか?
- 「クラス」とは何か?
- 「クラス」が登場したことにより,「関数」は不要になったのか?
- 「クラスを組み合わせる」ということはどういうことなのか?
- 「インターネット空間に散在するクラスを組み合わせる」ということはどういうことなのか?
- 「インターネット空間にクラスを提供する」ということはどういうことなのか?
最初の6つの疑問への回答は,今までの連載で述べております。忘れてしまった人は,お時間のあるときに復習しておいてください。今回は,“Webサービスとはそもそも何なのか?”を考えながら,最後の2つの疑問への回答を探してみましょう。Webサービスとクラスの間にはいったいどのような関係があるのでしょう?
ご承知のように,Webサービス技術は,W3Cをはじめとする各種標準化団体が策定する標準プロトコルに支えられています。このため,今回は次のような視点を設定して,Webサービスとは何か?への回答を探します。
視点1:W3CのWebサービス定義
視点2:マイクロソフトと標準プロトコル
視点3:Visual Studio .NETとWebサービス開発
視点4:Webサービスとクラス
最後の視点4では,Webサービスとクラスの関係をサンプル・プログラムを通して具体的に考えます。今回紹介するサンプル・プログラム(サンプル・プログラムのダウンロードはこちら)では,第4回で定義・実装したRensaiクラスをWebサービスとして再利用します。これまでの各連載で解説してきたクラスとWebサービスの間にはいったいどのような関係があるのでしょう?また,Webサービスでは,クラスとメソッドの関係がさらに変化してしまうのでしょうか?それでは本論に入りましょう。
図1●W3Cが公開した,Webサービスのドラフト仕様 |
![]() |
視点1:W3CのWebサービス定義
まずは,XMLやSOAPなどの標準仕様を策定している代表的な団体であるW3CのWebサービス定義を確認しておきましょう。W3Cは,2002年8月19日に公開したドラフト仕様の中で,Webサービスを次のように暫定定義しています(図1[拡大表示])。この定義文から次のようなことを理解することができます。
- Webサービスは,URIにより特定されるソフトウエア・アプリケーションである
- Webサービスは,インタフェースとバインド(接続)情報を持つ
- インタフェースと接続情報は,XMLで記述,定義され,インターネットに公開される
- インターネット利用者は,Webサービスを発見し,それを再利用することができる
- Webサービスとインターネット利用者間の通信は,XMLで記述されたメッセージの交換を通して行われる
W3Cが考えるWebサービスの概要を把握したところで,今度は,Webサービス実装時に重要な意味を持つ,XMLをはじめとする標準プロトコルと,Webサービス実装ベンダーであるマイクロソフトの関係を整理します。マイクロソフトは標準プロトコルをどのように認識しているのでしょう。
視点2:マイクロソフトと標準プロトコル
マイクロソフトは,WindowsシステムやVisual Studio .NETなどを開発,出荷するソフトウエア・ベンダーですが,Webサービス分野では,W3Cなどが策定した標準仕様を実装するベンダーの1社にすぎません。各種.NET製品を利用するうえで重要な意味を持ちますから,ここでは,マイクロソフトと標準プロトコルの関係を考えます。
マイクロソフトは,次のような標準プロトコルをサポートする旨をインターネット上で宣言しています。なお,各プロトコルの詳細については,本稿では解説しませんが,興味のある方はマイクロソフトのWebサイトを参照してください。一部プロトコルの日本語訳へのリンクも用意されています。
- メッセージ記述言語としてのXML
- メッセージ交換フォーマットとしてのSOAP
- Webサービス機能公開言語としてのWSDL
- 公開Webサービス登録方式としてのUDDI
しかしマイクロソフトは,これらのプロトコルを「基本(Baseline)プロトコルセット」と位置付けるとともに,次のような現実的な問題点を指摘し,基本プロトコルセットだけでは不十分であると主張しています。
“企業が Webサービスを開発していくなかで,そのソリューションは複雑さの度合を増しつつあり,この基礎を超えた部分での標準が明らかに必要となってきています。セキュリティ,ルーティング,信頼の置けるメッセージング,及びトランザクションなどの高度な機能を,独自の相互運用性のない形で実装しなくてはならないという Webサービス開発の現状と,これらの基礎仕様との間にはギャップが存在しています”
マイクロソフトはこのような問題へのソリューションとして,拡張仕様ともいうべき「Global XML Web Services Architecture」という名称を持つ構想を打ち出しています。この仕様の詳細については,マイクロソフトのWebサイトを参照してください。
ちなみに「Global XML Web Services Architecture」は,セキュリティ,C#や.NETランタイム・エンジンなどとともに,Microsoft Researchで研究が行われているとされます。この研究所の役割などに興味のある方は,プログラミング言語C#,と.NETフレームワークの開発の中心人物であるAnders Hejlsberg氏(Turbo PascalとDelphiもこの人が開発)の公開インタービュー記事を一読されるとよいでしょう。Anders Hejlsberg氏は,この研究所と緊密な連携をとりながらC#を開発したと述べています。
以上の情報から総合的に判断すると,Webサービスを実現するためのプロトコル・セットの一部は,まだ準備段階にあるといえるでしょう。それでは次に,このような現実を踏まえた上で,私たちが現在利用できるVisual Studio .NETのWebサービス開発機能を見てみることにします。
視点3:Visual Studio .NETとWebサービス開発
視点2では,Webサービスを支える一部プロトコルが不足していることを確認しましたが,“ここまでは完成している”という部分もあるはずです。ここでは,すでに出荷されているVisual Studio .NETのWebサービス開発機能を見てみます。Visual Studio .NETは実際に利用できる製品ですから,少なくとも,マイクロソフトのWebサービス戦略の一端は具体的に理解できるはずです。
Visual Studio .NETを利用してWebサービスを開発する場合,一般的には,Visual BasicやC#をはじめとする開発言語を選択し,「ASP .NET Webサービス」という名称のプロジェクトを選択することになっています。ここで一部の方は,“「XML Webサービス」ではなく,なぜ「ASP .NET Webサービス」なのか?”という疑問を持つことでしょう。ここには次のような事情があると考えておくとよいでしょう。
Webサービスは最終的にはインターネット空間に公開されますから,従来のWebサーバー開と同じように,XMLやSOAPなどの比較的新しいプロトコルに加えて,次のような実績のあるインターネット標準プロトコルの実装環境も必要となります。
- TCP/IP
- HTTP
- HTML
.NETの世界では,このようなプロトコルは,ASP .NETという,.NETフレームワークの一部機能として実装されています。表現を変えれば,ASP .NETはWebサービスを開発し,それを公開するためのインフラストラクチャ(基盤)という位置付けになります。このため,Webサービス開発機能は,ASP .NETの“派生機能”などと呼ばれることもあるようです。ただし,次の点はここできちんと理解しておく必要があります。
“ASP .NETは.NETフレームワークの一部であるため,「ASP .NET Webサービス」プロジェクトで開発されるWebサービスは,あくまでも「.NET対応Webサービス」である”
図2●「ASP .NET Webサービス」プロジェクトが自動的に作成するプロジェクト・ファイルの一部 |
![]() |
詳しくは後で説明することとし,「ASP .NET Webサービス」プロジェクトが自動的に作成してくれるファイルを確認しておきます。すべてのファイルの意味を詳細に説明することはできませんが,ASP .NETと.NETランタイム・エンジンという2つの視点(本来なら,Webサービス配置と管理という視点も必要ですが,今回は割愛します)から,「ASP .NET Webサービス」プロジェクトが自動的に作成するファイルの意味を整理しておきます。まずは,図2[拡大表示]のような情報を見ていただきましょう。
これは「ASP .NET Webサービス」プロジェクトが自動的に作成するプロジェクト・ファイルの一部です。XMLタグで構成されるこのファイルには,プロジェクト内で使用されるすべてのファイル情報が記述されています。この画面から分かるように,BuildActionというタグがあり,Compile,Content,EmbeddedResouceの3種類の文字列が記述されています。
CompileとEmbeddedResourceの2つの文字列は,選択した言語のコンパイラ(最終的には,.NETランタイム・エンジン)への指示であり,残りの文字列ContentはWeb Contentを意味し,ASP .NET向けの指示(つまり,開発したWebサービスをインターネット接続サーバーに配置する際に必要となる情報)であると考えてよいでしょう。
このようなファイル情報は,WebサービスがASP .NETと.NETフレームワークの組み合わせとして実装され,それゆえ,「ASP .NET Webサービス」と呼ばれる背景を明確に示しています。さらにXMLなどの標準プロトコルは,開発環境(この場合,「ASP .NET Webサービス」プロジェクト)内に実装され,ユーザーは日常的には意識する必要もないことも理解できると思います。
なお,Webサービス開発時には,ASP .NET以外のWebサービスを利用することができます。この場合は,「Web参照の追加」機能が用意され,再利用するWebサービスのプロキシ(代理)が環境内に作成されることになります。COMコンポーネントも同じように,参照を追加して利用できます。
では,これまでの説明を次のように整理しておきます。
“「ASP .NET Webサービス」プロジェクトは,Webサービス開発者からASP .NETと.NETランタイム・エンジンの存在を隠ぺいしてくれるビジュアル開発環境である。さらに,この環境は,XMLをはじめとする各種標準プロトコルの存在すら隠ぺいしている”
このように,Webサービス開発環境はASP .NETなどの基盤と標準プロトコルを私たちの目から隠ぺいしています。これは裏を返せば,Microsoftの開発者たちは,ユーザに不要な負担をかけることなく,基盤と標準プロトコル実装コードを更新し,配布することができる,といえます(例えば,このようなツールなど)。すでに触れたように,一部の拡張仕様はこれから策定されるのでしたね。なお,ASP .NETに興味のある方は,無料のGUIベースのWebアプリケーション開発ツール(Matrix)をダウンロードされるよいでしょう。このツールには,簡易IISも含まれているようです。
それでは最後に,Webサービスとクラスの関係を具体的なサンプル・プログラムを通して考えてみましょう。
視点4:Webサービスとクラス
視点3では,ASP(Active Server Pages)を発展させたASP .NETとWebサービス開発機能を取り上げましたから,ここでは,具体的なサンプル・プログラム(プログラミング言語はC#)を通して,現在開発できるWebサービスの背景と動作を確認します(サンプル・プログラムのダウンロードはこちら)。
今回のサンプル・プログラムをダウンロードし,ビルドした後,ブラウザを起動し,アドレス・バーに“http://localhost/No7WebService/No7SampleWebService.asmx”と入力すると,図3[拡大表示]のような画面が表示されます。なお,サンプル・プログラムの活用方法については,Readme.txtファイルを参照してください。
図3●サンプル・プログラムの呼び出し画面 |
![]() |
<%@ WebService Language="c#" Codebehind="No7SampleWebService.asmx.cs" Class="No7WebService.No7SampleService" %>
このコードの意味はすでに第1回で説明していますから,今回は説明を割愛します。ちなみに,このファイルは開発環境が自動的に作成してくれます。
実行画面をじっくり眺めると推察できるように,前回作成したC#クラスがWebサービス化されています。すでに触れたように,Webサービスの基盤となるASP .NET,.NETランタイム・エンジンおよび各種の標準プロトコル実装コードなどは開発環境が隠ぺいしてくれていますから,Webサービス開発は次のように整理できます。
“Visual Studio .NET環境でWebサービスを開発する作業は,独自ロジックを記述し,WebServiceとWebMethodという2種類の特殊な属性を追加することである”
サンプル・プログラム内では,次のようなコードを記述しています。
public class No7SampleService : WebService
このコードは,No7SampleServiceというクラスが事前に用意しているWebServiceクラスの機能を継承して作成されることを示しています。さらに,リスト1のようなコードも記述されています。
リスト1●サンプル・プログラムのソース・コード |
[WebMethod(BufferResponse=true,CacheDuration = 30, Description = "Nikkei BP ITPro 第6回RensaiクラスのWebサービス化", MessageName="No7getRensaiName")] public string RensaiName() { Rensai rensai = new No7WebService.RensaiNew(); rensai.setRensaiName("連載「10行のサンプル・プログラムで分かる.NETの基礎」第"); rensai.setKaisha("日経BP IT Pro"); rensai.setKaisuu(7); return rensai.getRensaiName(); } |
このコードには,WebMethodという文字列が含まれています。これは,正式にはWebMethodAttributeという名称のクラスであり,従来のメソッドをWebサービス・メソッドに“昇格”させるための機能を提供しています。
また,RensaiクラスからRensaiNewという新しいクラスが作成されていることが分かります。クラス設計や再利用上のヒントとコーディング上の考慮点なども提示してありますから,ぜひダウンロードし,検討してみてください。
これ以上のサンプル・プログラムの詳細については,プロジェクト・ファイルをダウンロードし,検討してみてください。検討の際には,第4回で触れた「従来の関数の所有者はプログラムであったが,メソッドの所有者はクラスになった」という視点を忘れないようにしてください。それではここで,これまでの説明を踏まえたうえで,Webサービスを次のように定義することにします。
“Visual Studio .NET開発環境で作成されるWebサービスは,インターネット空間に公開される「管理されるクラス」の別名といえる。このため,これまで単にメソッドと呼んでいたものは,Webメソッドと呼ぶことも可能である”
本連載は以上で終了です。視点1で触れたように,マイクロソフトは今後さらに多量の情報をインターネットから公開するものと予想されます。第1回からの連載内容を理解していれば,公開される情報を解読する上で必要と思われる基礎知識は十分備わっています。皆様のさらなる成長を祈念してやみません。ご閲覧ありがとうございました。またどこかでお会いいたしましょう。その日までごきげんよう!