.NETエンタープライズ
Webアプリケーション開発技術大全

ASP.NETランタイムの基本動作とWeb UIコントロールツリー

マイクロソフト コンサルティング本部 赤間 信幸
2004/05/08
Page1 Page2 Page3 Page4

1.2 ASP.NETのランタイム動作

 さて、ここから実際にIISとASP.NETランタイムがどのようなメカニズムで.aspxプログラムファイルからHTMLデータを生成するのかについて詳細に解説しよう。.aspxプログラムファイルからHTMLデータが生成するメカニズムは3つのフェーズから構成されている※2。これらを理解すると、ASP.NETのプログラミングスタイルを理解することができる。

  • aspxプログラムファイルの変換とコンパイル
  • Web UI コントロールツリーの構築
  • イベント処理

※2 従来のASPは単純にそれらがそのままプログラムとして動作するだけだったが、ASP.NETのランタイム動作はかなり複雑な挙動を行っている。

A. .aspxプログラムファイルの変換とコンパイル

 Webサーバ上に配置した.aspxプログラムファイルはそのまま実行されるのではなく、いったんクラスファイルに変換されてから実行されている。具体的には、以下の3ステップの処理が実行されている(図6)。

図6 .aspxプログラムファイルが処理される流れ
 
・.aspxプログラムファイルがC#あるいはVB.NETのクラスファイルのコードに変換される(初回のみ)。
  ・C:\WINDOWS\Microsoft.NET\Framework\<バージョン番号>\Temporary
  ・ASP.NET Filesの下にその変換コードが出力されている。
 
・クラスファイルがC#あるいはVB.NETのコンパイラによりコンパイルされる(初回のみ)。
 
・クラスファイルからページインスタンスが生成され、実行される。

 ここで、.aspxファイルはクラスファイルに変換されることに注意して頂きたい(インスタンスではない)。複数のクライアントブラウザから同一のプログラムに対して処理要求があった場合には、図7のようにクライアントからのリクエストごとにインスタンスが作成され、並列処理される。つまり、5人からの処理要求があれば5個のインスタンスが生成され、並列処理されるようになっている※3

※3 ASP.NETでは、ページインスタンスの再利用はせず、リクエストのつど毎回新しく作成し直すように動作する。ごく稀に、インスタンスを再利用した方が(すなわちオブジェクトプーリングをした方が)インスタンス生成/破棄のオーバヘッドが削減できるために性能がよくなると考えている人がいるが、これはほとんどの場合誤りである。確かにオーバヘッドはゼロではないが、単純なオブジェクトであればミリ秒にも満たない程度の小さなものでしかない。一般に、インスタンス生成/破棄のオーバヘッドが問題になるのは、そのインスタンス生成/破棄に伴ってリソース(例えばデータベースなど)への接続と切断が行われるような場合、あるいはクラスライブラリのような頻繁に使われる小さな汎用部品の場合(いわゆる「ちりも積もれば山になる」場合)である。ビジネスオブジェクトやページ処理といった粒度の大きいユーザアプリケーションレベルのコンポーネントについては内部に記述されたビジネスロジックの処理の方が相対的に重たいため、インスタンス生成/破棄のオーバヘッドを意識しなければならないようなケースはまずない。
 
図7 複数のクライアントブラウザから同一のプログラムに対して処理要求があった場合

B. Web UI コントロールツリーの構築

 上述の.aspxファイルからクラスファイルへのコード変換の際、HTMLデザインブロックはWebUIコントロールツリーと呼ばれるオブジェクト群に変換されるようになっている。具体的には、HTMLデザインブロック中に埋め込まれx<asp:XXX runat="server">というタグがWebコントロールと呼ばれるオブジェクトに変換され、ツリー構造に追加される。また、それ以外の部分(単純なHTML文字列)はリテラルコントロールと呼ばれるオブジェクトに変換され、ツリー構造に追加される。

 先のHelloWorld.aspxプログラムの場合には、HTMLデザインブロックから図8のようなWebUIコントロールツリーが生成されている。

図8 HelloWorld.aspxから生成されるWeb UIコントロールツリー

C. イベント処理

 そして実行時には、ランタイムが自動的にASP.NET処理ブロック中のいくつかのメソッド(イベントハンドラ)を呼び出す仕組みになっている。例えばページ処理開始時には自動的にPage_Load()メソッドが呼ばれるようになっており、終了時にはPage_Render()メソッド(隠しメソッド)が呼ばれるようになっている。

 先のHelloWorld.aspxプログラムの場合には、Page_Load()メソッドの処理が呼ばれることによりラベルの文字列が変更される。続いて隠しメソッドであるPage_Render()メソッドが呼ばれるとWeb UIコントロールツリー中の各WebコントロールからHTMLコードが出力され、これが最終的なHTML出力としてクライアントブラウザに返される(図9)。

図9 ASP.NETランタイムによるイベントハンドラの自動的な呼び出し

1.3 ASP.NETランタイムの基本動作のまとめ

 以上のことをまとめると、ASP.NETランタイムの基本動作は以下のように整理される。

・HTMLデザインブロック中に埋め込まれたWebコントロールを元にして、Web UIコントロールツリーが作成される。
 
・ランタイムからASP.NET処理ブロック中のPage_Load()メソッドなどが自動的に呼び出されて処理が進む。
  ・このようなメソッドを「イベントハンドラ」と呼ぶ※4
  ・このイベントハンドラを使うことにより、Web UIコントロールツリー内のオブジェクトを操作することができ、表示文字の変更やスタイル変更などができる。
 
・最終的には、Web UIコントロールツリーからHTMLが出力され、クライアントに返される。
 
※4 厳密な定義は異なるが、ここではこのように理解しておいてよい。

 この一連の動作から考えると、ASP.NETアプリケーションを開発する場合には以下の2点がポイントになることが分かる。

  • HTMLデザインブロックを使ったWeb UIコントロールツリーの作成方法
  • ASP.NET処理ブロックの中からのWeb UIコントロールツリーの操作方法

 この2つのポイントについては、「2 Web UIコントロールツリーの作成方法」で解説する。以降、多少ややこしい話が続くが、ASP.NETフレームワークを深く理解するためには避けて通れないポイントである。詳細なコーディング方法について暗記する必要はないが、概念的な部分については必ず理解して頂きたい。


 INDEX
  .NETエンタープライズWebアプリケーション開発技術大全
  ASP.NETランタイムの基本動作とWeb UIコントロールツリー
    1.ASP.NETランタイムの基本動作
  2.ASP.NETのランタイム動作
    3.Web UIコントロールツリーの作成方法
    4.ASP.NET処理ブロックの中からのWeb UIコントロールツリーの操作方法
 
インデックス・ページヘ  「.NETエンタープライズWebアプリケーション開発技術大全」


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 記事ランキング

本日 月間