連載

ASP→ASP.NET移行テクニック

第2回 移行インパクトのツボを探る

山田 祥寛
2004/05/22
Page1 Page2 Page3 Page4

○SSI(Server Side Include:サーバ側インクルード)、Server.Executeメソッド

 レガシーASPでは、現在のページに外部のページをインクルードするための手段として、2つのアプローチを提供していた。1つはSSI、そしてもう1つはASP 3.0で導入されたServer.Executeメソッドだ。ヘッダ情報やフッタ情報などの共通的なレイアウト部品を取り込むようなケースで、重宝していた読者諸君も多いのではないかと思う。

SSIの場合:
<!-- #include file="header.asp" -->
 
Server.Executeメソッドの場合:
Server.Execute("header.asp")

 これらのアプローチは、ASP.NETでも引き続きサポートされるが、以下の理由から継続的な利用は好ましくない。

(1)処理パフォーマンスが低い

 SSIはレガシーASP/ASP.NETとはまったく異なる仕組みとして動作する。従って、処理に際してのオーバーヘッドも大きく、処理パフォーマンスは著しく低下する。

 また、SSIはASPエンジンがページを処理する「前に」#Include命令を処理するため、条件いかんでページ取り込みの是非を判定するというような制御も行えない。

 ちなみに、ASP 3.0から導入されたServer.Executeメソッドは、当然ながらASP上で動作するメソッドであるので、上記のような心配はない。

(2)セキュリティ・ホールとなる可能性がある

 SSIの場合、基本的に外部ファイルの拡張子は問われない。つまり、「.asp」であっても「.inc」のような拡張子であってもよいわけだ。しかし、「.inc」のような本来レガシーASP/ASP.NETが想定していない拡張子が採用された場合、外部ファイルに対して直接にアクセスされるとコードが漏えいする危険性がある。

 もっとも、これは「.asp」や「.aspx」のような、実行エンジンが認識できる拡張子にすることで回避することもできる。Server.Executeメソッドはパラメータとして「.aspx」ファイル(レガシーASPでは「.asp」)しか指定することができないが、これはコードの漏えいを防ぐという観点からは意味がある。しかし、外部ファイルに対して直接アクセスされてしまった場合に、開発者が想定しない処理が行われてしまう可能性は、依然として否定できない。

 以上の問題点を解消するために、ASP.NETからは新たに「ユーザー・コントロール」が提供されている。ユーザー・コントロールに関する詳細は、それ自体大きなテーマでもあるので、本稿ではポイントの紹介にとどめることにしよう。詳細を知りたい方は、拙著『独習ASP.NET』(翔泳社刊)など専門の書籍をご覧いただきたい。

 ユーザー・コントロールを採用する利点というべきポイントは、以下の2つである。

(1)拡張子「.ascx」のファイルには、直接にアクセスすることができない

 ユーザー・コントロールの拡張子は「.ascx」でなければならない。そして、「.ascx」ファイルは外部から直接にURLを指定しても中身を参照することもできなければ、処理が行われることもない。あくまで「.aspx」ファイル(Webフォーム・ページ)から呼び出されることを想定しているというわけだ。

 もちろん、旧来のServer.ExecuteメソッドやSSIでも、拡張子を「.asp」に限定し、外部ファイルをアクセス制限した別フォルダで管理することによって、十分なセキュリティを確保することはできる。しかし、ここで注目していただきたいのは、ユーザー・コントロールでは、「セキュリティ確保を開発者が一切、意識する必要がない」という点だ。ASP.NETによってあらかじめ決められた規則に従っていれば、おのずと安全性が確保される。これは、アプリケーションが人に依存せず、常に平準的な品質を保つという点で大変重要なポイントである。

(2)フラグメント・キャッシュを利用できる

 ユーザー・コントロールを利用することの最大の優位点は、ASP.NETから導入されたフラグメント・キャッシュを利用できるという点だろう。従来、ページをキャッシングする場合には、ページ全体を対象とする「ページ・キャッシュ」が一般的であった。しかし、「フラグメント・キャッシュ」を利用することで、文字どおり、ページの断片(ユーザー・コントロール)の単位にキャッシュを行うことができる。

フラグメント・キャッシュの概念

 一般的に、Webフォーム・ページ内には、頻繁に情報が切り替わる部分とほとんど固定的な(静的な)部分とが混在している。そのような場合にもフラグメント・キャッシュを用いることで、特性に応じた断片ごとのキャッシングが可能となる。

 ユーザー・コントロールを導入する方法は簡単だ。第1回のsample.aspxctrl.ascxをご覧いただきたい。外部ファイルには、ただ単に@Controlディレクティブを付加すればよい。呼び出し元のWebフォーム・ページ(「.aspx」ファイル)では、@Registerディレクティブを定義するだけでユーザー・コントロールを呼び出すことができる。

 以上、今回はASPにおける主要な構成要素である「組み込みオブジェクト」や「ディレクティブ」、「Global.asa」などにフォーカスして、それぞれの変更点から移行時のインパクトを探ってみた。

 以上でレガシーASP/ASP.NETの内部的な移行ポイントについての解説は完了だ。次回(最終回)では、レガシーASP/ASP.NETを外部から支えるCOM(Component Object Model)との相互運用について解説する。COMは、プログラム(スクリプト)言語、そしてビジネス・ロジックの抽象化に欠かせない位置を占める重要な項目である。End of Article


 INDEX
  ASP→ASP.NET移行テクニック
  第2回 移行インパクトのツボを探る
    1.変更・廃止されたオブジェクト/メソッド
    2.推奨されないメソッド/プロパティ
    3.ディレクティブ構文/Global.asax/構成ファイルの変更点
  4.SSI/Server.Executeメソッドについて
 
インデックス・ページヘ  「ASP→ASP.NET移行テクニック」


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

本日 月間