特集
NetDictionaryで始める
Webサービス・プログラミング

.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サービスを呼び出すことができる。


 INDEX
  [特集]NetDictionaryで始めるWebサービス・プログラミング
  第3回 Webサービス・プログラミング始めの一歩
    1.Webサービスを記述するasmxファイル
  2.Codebehindによるコードの分離
    3.[WebMethod]アトリビュートの機能
    4.[WebService]アトリビュートの追加
    5.WebServiceクラスの継承
 
 特集 : NetDictionaryプロジェクト


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間