| NetDictionaryで始める Webサービス・プログラミング 2.Codebehindによるコードの分離
デジタルアドバンテージ |
|
前項で示したasmxファイルの内容は、ASP .NETのタグとC#のコードが1つにまとまっていたが、これを次のように分離して記述することができる。
|
|
| whatstime.asmx | |
| asmxファイルは「@ WebServiceディレクティブ」の行のみとなる。 |
|
|
| 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」を仮想ディレクトリ「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」が出来上がり、コマンド・プロンプトから単体アプリケーションとして実行することができる。
|
|
| 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プロジェクト |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|






