§12.1 へ戻る

12.2 ASP.NET

動的に Web ページを作成するサーバ・システムである ASP.NET は, ロジックと HTML デザインをきれいに分離できます。 そのアプローチは,次世代のフレームワークとして Java 陣営が推進している JSF (Java Server Faces) にも似た,直感的に分かりやすいものです。

ASP.NET は,Web ページのテキストフィールドやボタンなどの各画面部品に対して, 一般の GUI アプリケーションのように状態保持やイベントハンドリングを実現します。 イベントハンドラやそこから呼び出される様々なメソッドのプログラムコードは, C# オブジェクトのレベルでロジックを記述します。 実装としては,Web ページ上の画面部品が個々に状態を保持しているわけではなく, HTTP セッションやクエリ パラメタによってそう見せかけているのですが, そのことは開発者の目から隠蔽されています。 ロジックは,抽象的に,状態を保持するオブジェクトとして画面部品を扱います。 イベントハンドラで画面部品の状態を変更すれば, Web 画面にそれが反映されますが,そのとき開発者が HTTP リクエストとレスポンスのことを思いわずらう必要はありません。

それでなお,少なくとも筆者が確かめた限りでは標準規格に非常に忠実です。 事実,ASP.NET プログラムの作成時,確認用のブラウザとして Windows 上の IE でなく Macintosh 上の Safari や Camino を使った場合にも不具合は確認されていません。

開発時,抽象的なロジックの C# オブジェクトと, 具体的な Web ページの HTML タグを結合するために人がすべきことは, C# ソースと HTML ファイルの二つのテキストで, 両者の名前 (識別子) を一致させることだけです。 もちろん,C# ソースは HTML ファイルなしにコンパイルすることができます。 両者の結合は,実行時にシステムがリフレクション機能を使って自動的に行います。

ですから,(しばしば高価な) 統合開発環境を使えば, (それに応じた) 各種の便宜が得られますが,たとえそれがなくても

  1. HTML と C# を編集するためのテキスト・エディタ (Meadow など)
  2. プレビュー用の Web ブラウザ (Mozilla など IE 以外も OK)
  3. C# プログラムを編集した後,コンパイルするための端末 (典型的には 上向きカーソルと Enter キーを順に打鍵して bash ヒストリ上の make コマンドを延々と実行する)
  4. ライブラリ仕様を確認するためのドキュメント・ブラウザ (.NET Framework SDK に付属)
  5. ASP.NET のサービスを提供する Web サーバ (典型的には IIS)

だけあれば,ASP.NET の開発ができます。

よく統合開発環境のコンポーネントとして用意されている, ひとつ何かを設定すると魔法のようにあちこちのファイルを 変更する専用ツールはさしあたり不要なことに注意してください。 その都度手を入れる必要があるのは, ロジックのための C# ソースとデザインのための HTML ファイルだけです。 サーバを再起動しなくても,コードの変更はすぐ反映されます。

XML による設定ファイルで各種の設定を変更することもできますが, 一度書けば Web アプリケーション間で使いまわせますし, デフォルトが賢く設定されていますから,普通はすべてを書く必要はありません。 Web アプリケーションのディレクトリ構成は単純です。 サーバへの配置は,基本的には, 設定ファイル等も含んだ Web アプリケーションのディレクトリをそのままドラッグ&ドロップするだけです。 *2 (後述のように,IIS の場合,もう1個だけ手間があります)

IIS の導入

ASP.NET のための Web サーバとして,Windows 2000/XP Professional では IIS (インターネット インフォメーション サービス) が利用できます。 *3 もしも未インストールならば,

コントロールパネル → プログラムの追加と削除 → Windows コンポーネントの追加と削除

でインストールできます。 §11.2 で述べたように,普通は .NET Framework をインストールする前に IIS をインストールしておきます。 なぜなら .NET Framework のインストーラは,マシンに IIS があるかどうかを判定し, もしあれば IIS から ASP.NET を使えるように設定を変更するからです。

もしも後から IIS をインストールした場合は, aspnet_regiis コマンドを使って手動で設定します。 このコマンドへは §11.2 の /cygwin.bat の設定で PATH が通っているはずです。

01:~$ type aspnet_regiis
aspnet_regiis is /cygdrive/c/WINDOWS/Microsoft.NET/Framework/v1.1.4322/aspnet_re
giis
01:~$ 

具体的には -i オプションとともに実行します。

01:~$ aspnet_regiis -i

-? オプションで簡単なヘルプが得られます。

01:~$ aspnet_regiis -?

IIS への登録

IIS を利用する場合,Web アプリケーションのディレクトリは典型的には /cygdrive/c/Inetpub/wwwroot/ の下に設けます。 たとえば /cygdrive/c/Inetpub/wwwroot/TestApp/ を作ります。 この下に HTML ファイルや C# のライブラリを置くのですが, そこを Web アプリケーションとして登録しておく必要があります (とりあえず必要なサーバ設定作業はこれだけです)。

コントロールパネル → 管理ツール → インターネット インフォメーション サービス → 左ペインの「インターネット インフォメーション サービス」 → (ローカルコンピュータ) → Web サイト → 既定の Web サイト → TestApp → 右クリックのコンテキスト・メニューから「プロパティ」 → 「ディレクトリ」タブ → 「アプリケーションの設定」の「作成」ボタン (右図参照)

この「作成」ボタンを押すと,左ペインの「TestApp」のアイコンが変わり, 「作成」ボタンが「削除」ボタンになります。 「OK」ボタンを押して登録します。

ディレクトリ構成

Web アプリケーションの基本的なディレクトリ構成は2層です。 ディレクトリ直下には HTML ファイル (*.aspx ファイルを含む) や省略可能な設定用 XML ファイル web.config, それから bin ディレクトリを置きます。 必要ならば, アプリケーションのセッション開始時や終了時のハンドラを記述する global.asax もここに置きます*4

ロジックを記述する C# プログラムは, プライベート アセンブリとして *.dll ファイルにし, bin ディレクトリの下に置きます。 *.dll ファイルの名前は任意です。 Cygwin を使う場合,bin ディレクトリの下に C# のソースと Makefile を一緒に置いておくと好都合です。 C# ソースを編集したら,make コマンドで *.dll ファイルをビルドし直すわけです。

なお,bin ディレクトリを設けずに, *.aspx ファイルに <script> タグで C# ソースをじかに埋め込んだり, ソース ファイルのまま置いて,*.aspx ファイルから src 属性の値でソース ファイル名を指定することもできます。 ただし,マルチウィンドウ環境のもとでは, そうしたからといって, 若干の手間が省けるだけで,際立って便利になるわけではありません。

アプリケーション例

例としてテキストを入力してそれを表示する Web アプリケーションを示します。 ディレクトリ構成は次のとおりです。

実際に実験するときは,TestApp.tar.gz をダウンロードして展開してください。md5sum 値は 6103a44d4c3ff84fd1e52276f88feb1a です。

<%@ Page Inherits="InputPage" %>
<html>
  <head><title>input</title></head>
  <body>
    <form runat="server">
      何か入力してください
      <br />
      <input id="text1" type="text" runat="server" size="60" />
      <input type="submit" runat="server" OnServerClick="Submit_Click" />
      <br />
      <span id="span2" runat="server">__警告表示__</span>
    </form>
    <p>最終更新: <span id="span1" runat="server">__時刻表示__</span></p>
  </body>
</html>

上図は default.aspx,右図は input.cs です。

default.aspx に出現する InputPage, text1, Submit_Click, span2, span1 という名前が input.cs にも出現していることを確かめてください。

UI.Page オブジェクトの IsPostBack プロパティは, 初めてページを読み込んでアクセスしているとき,false になります。

一箇所だけ *.aspx ファイルに input.cs が依存している箇所があります。 ページ遷移のための Sever.Transfer() です。 引数として文字列 "result.aspx" を参照しています。

<%@ Page Inherits="ResultPage" %>
<html>
  <head><title>result</title></head>
  <body>
    <p>入力されたテキスト: 
       <span id="span1" runat="server">____</span>
    </p>
  </body>
</html>

上図は result.aspx,右図は result.cs です。

result.aspx に出現する ResultPage, span1 という名前が result.cs にも出現していることを確かめてください。

初めてページを読み込んだとき,つまり,ここにページ遷移してきたとき, ページ遷移元の InputPage オブジェクトを, Context.Handler からキャストして取得します。 そして,InputPage の公開プロパティ InputText を使って, その画面部品の状態値を取得して表示します。

実行例

TestApp の実行例を示します。 ブラウザには Macintosh (OS X 10.3.8) 上の Firefox 1.0.2 を使用しています。

/TestApp/ を GET すると default.aspx をもとに HTML ページが返されます。 「最終更新」の日付時刻は Page_Load イベント ハンドラが span1.InnerText = DateTime.Now.ToString() を実行して作っています。

ひらがな,カタカナあわせて 15 文字を入れて「実行」すると, 20 文字には足りませんから, ボタン イベント ハンドラの if (InputText.Length < 20) の条件に適合し, span2.InnerText = InputText.Length + "文字しか入力されていません" が実行されます。 Web 画面に「15文字しか入力されていません」と表示されます。

「あいうえおカキクケコさしすせそ」の 15文字を入力欄から delete して, 今度はハンガリー語*5と日本語を混ぜて入れてみます。 Mac (と BeOS) はこのような各国のラテン文字の入力が楽で助かります。

「実行」すると,今度は 20 文字以上ありますから, ボタン イベント ハンドラの if 文の else 節 Server.Transfer ("result.aspx") が実行されて, result.aspx のページに遷移します。

C# の string が Unicode 文字列型であることに注意してください。

TestApp の例では *.aspx ファイルや *.cs ファイルを Shift_JIS で書きました。 しかし,この例に見るように, なぜか日本語だけでなくヨーロッパ諸国の文字も難なく処理できています。 実際,ここでブラウザに与えられているのは Shift_JIS ではありません。 Unicode の ASCII 互換な表現形式である utf-8 で書かれた HTML ファイルです。

たとえばクラシック音楽を扱う場合を考えればすぐに分かりますが, 今日の市民生活全般に対応するためには,Web アプリケーションは日本語と英語を入出力できるだけでは不十分です。 ASP.NET は,より望ましい方向へ一歩進んでいるといえるでしょう。

次回予告

次回は Cygwin に移植されたウィルス検出ソフト ClamAV を取り上げようと思います。


脚注

*2 これと比べて Java Jakarta を素手で扱おうとしたときの,あの面倒はなんだったのか, と思い出さずにはいられません。 息を一つするにも,どこか奥深い長大な大域的設定ファイルのなかの, 直感に欠ける項目の,分かりづらい修正が必要な気がしたものです。 「簡単なことは簡単に」というあの有名なモットーは, ここにこそ切実な需要があるといえるでしょう (し,現実に今それに応じた市場が形成されている,といえるでしょう。 もしもはじめから,素の状態で使いやすいように設計されていたら, 今日の Java Web 開発環境の市場はあるいはなかったかもしれません)

*3 ASP.NET Web サーバとしてはもう一つ, .NET Framework 自身で書かれた Cassini Sample Web Server が Microsoft 社からソース込みで公開されています。 これは Windows XP Home Edition でも動作します。
そのままでは localhost のクライアントにしかサービスしませんが, その公開サイトの掲示板に書かれているように, ソース・ファイル Request.cs の中でコード 403 を出力している if 文をコメントアウトしてビルドすれば 制限を解除できます。 もちろん .NET Framework SDK だけでビルドできます。
用意されているビルド用のバッチ ファイルを使うと, gacutil (Global Assembly Cache UTILity) コマンドによって Cassini.dll が大域的にインストールされます (Windows XP の場合,普通は /cygdrive/c/WINDOWS/assembly/GAC にです)。 しかし,大域的にインストールしなくても, Web アプリケーションの bin ディレクトリに Cassini.dll をコピーすれば動作します。 この場合,大域的な登録なしにフォルダ内だけですべてが完結します。
少し工夫すれば,完全にドラッグ&ドロップだけでインストールが完了する, サーバ込みの Web アプリケーションを作ることができるでしょう。 動的 Web コンテンツをエンドユーザにパッケージ化して配布する手段として 有用かもしれません。

*4 global.asax のハンドラ Session_OnStart や Session_OnEnd 等は無引数ですが,System.Web.HttpApplication の (うるさくいえば,暗黙裏に生成されるその派生クラスの) メソッドとして解釈されますから,Session などのプロパティにアクセスできます。

*5 良い(jó)   朝(reggel) を(-t)   私は(-ok) 望む(kíván)。 発音はおおよそ「ヨー レッゲルト キヴァーノク」

目次へ戻る

Copyright (c) 2005 Oki Software Co., Ltd.