特集
NetDictionaryで始める
Webサービス・プログラミング
2.Codebehindによるコードの分離
デジタルアドバンテージ
2001/12/05
|
|
前項で示したasmxファイルの内容は、ASP .NETのタグとC#のコードが1つにまとまっていたが、これを次のように分離して記述することができる。
1: <%@ WebService Language="c#" Class="WhatsTimeClass" %> |
|
whatstime.asmx |
asmxファイルは「@ WebServiceディレクティブ」の行のみとなる。 |
1: using System;
2: using System.Web.Services;
3:
4: public class WhatsTimeClass: WebService {
5: [WebMethod]
6: public string WhatsTime() {
7: return DateTime.Now.ToString();
8: }
9: }
|
|
whatstime.cs |
こちらはプログラム・コード部分を記述したC#のソース・ファイルとなる。 |
whatstime.asmxでは「@ WebServiceディレクティブ」の行のみを残し、残りの部分は、(C#言語を使用する場合には)拡張子が.csの通常のC#のソース・ファイルとして記述する。
このようにプログラムのコード部分を分離して記述した場合には、前述のようにasmxファイルをコピーすればよいというだけでなく、プログラムの配置について少し準備が必要になる。まず次のようにしてcsファイルをコンパイルし、DLLファイルを作成する。
csc /target:library whatstime.cs |
ここで“/target:library”は、実行ファイルではなく、DLLファイルを生成するためのコンパイル・オプションだ。これを実行することにより「whatstime.dll」というファイルが出来上がる。asmxファイル単体のときには、IISの仮想ディレクトリを作成しなくても、「\Inetpub\wwwroot」ディレクトリに直接asmxファイルを配置することもできたが、Codebehindを使用するときには、仮想ディレクトリの設定が必須になる。コンパイラによってDLLファイルが生成されたら、IISの仮想ディレクトリとして設定したディレクトリに「bin」という名前のディレクトリを作成し、そこに配置する。例えば「c:\csharp\webservice」を仮想ディレクトリ「webservice」として設定した場合には、最終的なファイルの配置は次のようになる。
c:\csharp\webservice\bin\whatstime.dll
c:\csharp\webservice\whatstime.asmx
|
|
ファイル配置の例 |
「c:\csharp\webservice」を仮想ディレクトリ「webservice」として設定した場合、asmxファイルとコンパイラによって生成されたDLLファイルをこのように配置する。「webservice」が仮想ディレクトリになっていることから、外部からは「http://localhost/webservice/whatstime.asmx」としてこのWebサービスにアクセスできる。C#のソース・ファイルは実行時には不要である。 |
このように、Webサービスを公開するために必要なファイルはDLLファイルとasmxファイルだけで、C#のソース・ファイルは実行時には不要である。この場合はコンパイルによってDLLファイルを生成済みであるため、正確にはasmxファイルでのLanguage属性による言語の指定も省くことができる。
仮想ディレクトリの直下に作成する「bin」ディレクトリは、必ずこのディレクトリ名でなくてはならない。Webサービスの実行時には、asmxファイルに記述された「@WebServiceディレクティブ」のClass属性で指定されたクラスを含むコンポーネントが、このbinディレクトリより検索され、実行される。この検索ではファイル名は参照されないので、DLLファイルの名前は何でもよい。ただし次のように、Class属性の値として、クラス名に続きDLLファイル名(「.dll」を除いた部分)を指定しておけば、この検索処理をスキップすることができ、Webサービスの起動を若干速くすることができる。
<%@ WebService Language="c#" Class="WhatsTimeClass, whatstime" %> |
もちろん、プログラム・コードはあらかじめコンパイルされているのでWebサービスの起動は(初めてアクセスする場合のみだが)、asmxファイルのみで記述した場合より速くなる。
このようなスクリプトとプログラム・コードの分離はASP .NETのCodebehind(コード・ビハインド。「behind」は「〜の陰に」という意味)と呼ばれる機能だ。本来Codebehindは、ブラウザからアクセスするWebアプリケーションを設計する際に、ユーザー・インターフェイスをデザインするHTMLデータと、それらが操作されたときに実行されるプログラム・コードを分離するための機能であり、Webサービスでは、この機能のありがたみがあまり感じられないかもしれない。しかしWebサービスの開発においても、Codebehindを使用する利点がいくつかある。
Codebehindによる利点
Webサービスにおいて(Webアプリケーションにもいえることだが)、Codebehindによりプログラム・コード部分を分離できることの利点の1つは、出来上がったコンポーネントを単体で扱えることだ(.NET Frameworkでは、狭い意味で、「System.ComponentModel.IComponentインターフェイス」を実装したクラスをコンポーネントと呼ぶこともあるが、ここではDLLファイルとして扱えるということで、もう少し広い意味でコンポーネントと呼んでいる)。
例えば先ほどのWhatsTimeClassクラスを含むwhatstime.csに、次のように「Mainメソッド」を追加し、コンパイル・オプションなしでコンパイルすれば、「whatstime.exe」が出来上がり、コマンド・プロンプトから単体アプリケーションとして実行することができる。
1: using System;
2: using System.Web.Services;
3:
4: public class WhatsTimeClass: WebService {
5: [WebMethod]
6: public string WhatsTime() {
7: return DateTime.Now.TimeOfDay.ToString();
8: }
9:
10: public static void Main() {
11: WhatsTimeClass wtc = new WhatsTimeClass();
12: Console.WriteLine(wtc.WhatsTime());
13: }
14: }
|
|
Mainメソッドを追加したコンポーネント |
コンパイル・オプションなしでコンパイルすれば、コマンド・プロンプトから単体アプリケーションとして実行することができる |
Mainメソッドを追加したwhatstime.csをコンパイルし、実行した結果は次のようになる。
|
Mainメソッドを追加したコンポーネントの実行 |
コマンド・プロンプトで実行して、Webサービスの機能をテストすることができる。
|
このように、Mainメソッドを記述することにより、コンポーネントの機能を単体でテストできるようになる。Mainメソッドは単なる1つのメソッドであるため、このソース・コードからは、Mainメソッドを削除せずとも「/target:library」オプションをつけてコンパイルすることにより、ソース・コードはそのままにDLLファイルを作成することができる。
Codebehindについてはもう一言述べておこう。VS .NETの新規プロジェクトでWebサービスを選択してWebサービスを作成した場合には、デフォルトでCodebehindによりソース・コードが生成される。例えば「Service1.asmx」というasmxファイルが作成された場合には、「Service1.asmx.cs」というcsファイルが併せて作成される(プロジェクトの言語でC#を選択している場合)。そして「@ WebServiceディレクティブ」には次のように「Codebehind属性」によりService1.asmx.csが指定される。
<%@ WebService Language="c#" Codebehind="Service1.asmx.cs" Class="WebService1.Service1" %> |
ただし、このCodebehind属性はVS .NETがソース・コードを管理するためだけに使用されるようだ。実際、この属性を削除しても正常にWebサービスを呼び出すことができる。