豊田 孝

図1●宣言部と実装部を同一のASMXファイル内に記述したWebサービス・クラス
 前回は単純なWebサービス・クライアント・プログラムを作成し,Webサービス,クラス,Web Service Description Language(WSDL)の関係を説明しました。これまで紹介してきたWebサービス・クラスは,図1[拡大表示]のように,宣言部と実装部を同一のASMXファイル内に記述していました。

 本日は,Webサービス・クラスをASMXファイルではなく,独立したファイルとして実装します。宣言部と実装部を切り離す,このような開発方式は,コードビハインド・プログラミングと呼ばれています。コードビハインド・プログラミングにはいろいろな方法があるのですが,今回は,もっとも単純な方法を紹介します。

 それではさっそく,Webサービス宣言部から作成しましょう。

Webサービス・クラスの宣言

 Webサービス・クラスの宣言は,これまでと同じように,ASMXファイル内で次のように行います。

<%@ WebService Language = "C#" Class = "No9csClass" %>

 この宣言は,次のような意味を持っています。

“C#プログラミング言語で実装したNo9csClassクラスを,Webサービスとしてインターネットに公開する”

 ASMXファイルにはこの1行だけを記述し,公開するNo9csClassクラスは別ファイルに実装します。

Webサービス・クラスの実装

 インターネットから公開するWebサービス・クラスは,宣言部に指定したプログラミング言語で別ファイルに実装します(リスト1)。ここでは,Visual C# .NETの実装例を示します。

リスト1●公開するNo9csClassクラスをASMXファイルとは別のファイルに実装する
using System;
using System.Web.Services;
using System.Web;

[WebServiceAttribute(Namespace="http://ITPro.com/toyotawebservices/",
Description= "IT Pro連載第9回:コードビハインド・プログラミング", Name="No9ServiceCS")]
public class No9csClass : WebService
{
[WebMethodAttribute(BufferResponse=true, CacheDuration = 5,
 Description="Display User Agent Info",
 MessageName = "TryIt!")]
 public String MyWebService()
 {
  HttpContext hc = Context;
  HttpRequest hr = hc.Request;
  String ua = hr.UserAgent;
  String retStr = String.Concat("No9csService: ", ua);
  return retStr;
 }
}

 ご覧のように,基本的には,これまでのASMXファイル内の実装部を切り取り,別のファイルに貼り付けるだけです。実装部を貼り付けたファイルは,拡張子csを持つファイルとして保存します。ここでは,AdvancedNo9cs.csファイルとして保存することにします。

 ファイルを保存し,次のようにコンパイルします。

c:\itpro\cs\bin\>csc /target:library AdvancedNo9cs.cs

 CSCはVisual C# .NETコンパイラであり,/targetは作成するプログラムの種類を指定するコンパイラ・オプションです。この場合,拡張子dllを持つライブラリ・ファイルを作成するように指示しています。ライブラリ・ファイルは,ここでは,公開されるWebサービス・クラスを収容するファイルである,と考えておいてください。

図2●サンプル・プログラムの実行結果
 ソース・コードに問題がなければ,AdvancedNo9cs.dllという名称を持つライブラリ・ファイルが作成されますから,それをBINディレクトリに格納します。連載第3回で説明した手順でWebサービスを公開している場合,「C:\ITPro\CS」ディレクトリにASMXファイルを格納し,このディレクトリの直下にBINディレクトリを新たに作成し,AdvancedNo9cs.dllライブラリ・ファイルを格納することになります。なぜBINディレクトリに格納する必要があるのか?という疑問を持つ人もいると思いますが,それは,ASP .NET側の都合に合わせているからです。実行結果を図2[拡大表示]に示します。

 ご覧のように,ユーザー・エージェント情報が無事に返されます。なお,宣言部を次のように記述すると,パフォーマンスが改善されます。

<%@ WebService Language = "C#" Class = "No9csClass, AdvancedNo9cs" %>

 Class属性を見ると分かるように,クラス名No9csClassに加えて,それを実装するAdvancedNo9csファイル名を指定しています(拡張子DLLを指定する必要はありません)。特定のファイル名を指定すれば,ASP .NET側は目的のファイルを効率的に検索できるようになります。

コードビハインドのメリット

 コードビハインド・プログラミングを採用する最大のメリットは,“コンパイル・エラーを事前に検出できる”ということです。従来のように,宣言部と実装部を同一のASMXファイルに記述している場合,ASMXファイルがアクセスされるまでは実装部のエラーを検出できません。宣言部と実装部をコードビハインドにより分離しておけば,実装部を公開前にテストできます。

 これ以外にも,例えば,追加作成したBINディレクトリやクラス実装ファイルにセキュリティを設定できる,などの運営,管理上の柔軟性が増すことなども挙げることができます。

 後日お時間のあるときにいろいろ試してください。必要なファイルはこちらからダウンロードできます。なお,ファイルをダウンロードすると,その中に拡張子optを持つファイルが含まれています。このファイルは,コンパイラ・オプションを定義していますから,次のようにコンパイラに渡します。

c:\itpro\cs\bin\>csc @No9cs.opt

c:\itpro\vb\bin\>vbc @No9vb.opt

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