はじめに
ASP.NET 1.1においては、実行環境からaspxファイルを取り除くことはできないと思われています。しかし、ちょっと面倒ではありますが、いくつかの手順を踏むことによって、aspxファイルを配布せずコンパイル済みのdllを利用してASP.NETアプリケーションを実行させることが可能です。
以下の記事では、まず作業の手順を一通り紹介し、その後で技術的な解説を行います。
対象読者
.NET Frameworkを用いてWebアプリケーションを開発している方。
必要な環境
.NET FrameworkをインストールしたWindowsマシン。
作業の手順
事前準備
- ASP.NETアプリケーションをReleaseモードで実行できるようにしておきます。Visual Studio .NETで開発を行っている場合、モードをReleaseに変更し、また、「Web.Config」ファイルの
compilation
セクションに記述されているdebug
属性をfalse
に書き換えたうえで、[ソリューションのビルド]を実行しておきます。
- サーバ上のASP.NETアプリケーションの実行をすべて停止し、次のフォルダ以下に存在するすべてのフォルダを削除します。
- 最終的な成果物を格納するためのフォルダを新規に作成します。以下では、このフォルダを「成果物フォルダ」と記述します。成果物フォルダ内には「bin」という名前のフォルダを作成しておきます。
ASP.NETアプリケーションの実行とdllの取り出し
- ターゲットとなるASP.NETアプリケーションを実行します。ここですべてのページが一通り表示されるようにします。
- 2できれいにした「Temporary ASP.NET Files」フォルダに、新しくASP.NETアプリケーション名のフォルダが作成されています。このフォルダの下にはランダムな名前を持ったフォルダの階層が作成されています。この階層の中に含まれるすべてのdllファイルを成果物フォルダの中につくった「bin」フォルダにコピーします。
- 「bin」フォルダにコピーしたファイルを1つづつ.NET Framework SDKに含まれるildasmツールで開き、そこに含まれるクラス名を確認します。
sample.DLL | sample.Global 、sample.WebForm1 、sample._default |
w0ctilyd.dll | ASP.Global_asax |
zsqgsacq.dll | _ASP.WebForm1_aspx 、_ASP.default_aspx |
ASP.Global_asax
クラスが含まれているdllを削除します。
ASP.Global_asax
クラスが含まれていたので、このファイルを削除しました。「web.config」ファイルの修正
- ターゲットとなるASP.NETアプリケーションの「global.asax」ファイルと「web.config」ファイルを成果物フォルダにコピーします。
- 「web.config」ファイルの
system.web
セクションの中にhttpHandlers
セクションを追加します。その中にadd
セクションを追加し、aspxファイル名、aspxファイルがコンパイルされたクラス名、そのクラスが含まれるdllファイル名を記述します。
<httpHandlers> <add verb="*" path="aspxファイル名" type="aspxクラス名, dllファイル名" /> </httpHandlers>
<httpHandlers> <add verb="*" path="default.aspx" type="_ASP.default_aspx, zsqgsacq" /> <add verb="*" path="WebForm1.aspx" type="_ASP.WebForm1_aspx, zsqgsacq" /> </httpHandlers>
「default.aspx」ファイルの追加
- 成果物フォルダに「default.aspx」ファイルを追加します。このとき、「default.aspx」ファイルの中身は空にします。
ASP.NETアプリケーションの実行
- 成果物フォルダを、IISの管理ツールから仮想ディレクトリとして追加します。追加した仮想ディレクトリにアクセスし、ターゲットのASP.NETアプリケーションと同じ動作をすることを確認します。
sampleアプリケーションではASP.NETアプリケーションに新しい名前をつけても正しく動作しましたが、
HyperLink
コントロールを利用した場合はASP.NETアプリケーション名が同じでないとリンクが正しく動作しませんでした。技術解説
「Temporary ASP.NET Files」フォルダとは何か
ASP.NETであっても.NET Framework上で実行されるためにはコンパイル済みのdllファイルが必要です。ASP.NETでは、aspxファイルからソースコードを自動生成し、そのコードをコンパイルしてdllファイルを作成しています。このdllファイルが置かれる場所が、「Temporary ASP.NET Files」フォルダ以下に自動的に生成されるフォルダ階層になります。aspxファイルを修正した場合、新たにコンパイルが行われてdllファイルが追加されていきます。このため、上記の作業中ではまず存在しているすべてのdllファイルを削除し、最新のdllファイルのみを取り出すという手順を取っています。
httpHandlersセクションに何を追加しているのか
ASP.NETでは、リクエストで指定されたパスに基づいて、そのリクエストをどのクラスが処理するかを設定することが可能です。この設定を行うのがhttpHandlers
セクションです。ここで設定するリクエストを処理するためのクラスはIHttpHandler
インターフェイスを実装している必要があります。Page
クラスはIHttpHandler
インターフェイスを実装していますので、Page
クラスを継承するaspxファイルもリクエストを処理するクラスとしての要件を満たしています。上記の作業でaspxファイルごとに処理を行うクラスを設定することにより、リクエストに対して直接クラスが呼び出されるようになります。このため、aspxファイル自体は存在していなくてもASP.NETの処理が行われます。
「global.asax」の取り扱い
「global.asax」ファイルについてはコンパイル済みのdllを利用する方法がどうしても見つけられませんでした。そのため「global.asax」ファイルをコピーし、そのまま利用することにしました。この場合、「Temporary ASP.NET Files」フォルダから取り出したdllファイルにはコンパイルされた「global.asax」ファイルも含まれてしまうので、そのdllを削除する必要がありました。
「default.aspx」はなぜ必要か
ファイル名を指定せずにASP.NETアプリケーションにアクセスした場合、まずIISが既定のドキュメントに設定されているファイルが存在しているかどうかをチェックします。このとき既定のドキュメントに設定されているファイルが1つも存在していないとエラーが表示されてしまいます。「default.aspx」ファイルが存在していれば、IISはリクエストを「default.aspx」ファイルに向けて送ります。このリクエストを受け取ったASP.NET側では、httpHanlers
セクションの設定に従って「default.aspx」ファイルへのリクエストを_ASP.default_aspx
クラスに送ります。このため、「default.aspx」ファイルは空であっても処理が行われることになります。
aspx以外のファイルを利用している場合の作業
ユーザコントロール(ascxファイル)を利用している場合については、httpHandlers
セクションへの追加は必要ありません。dllの中に利用しているascxファイルのクラスが存在していることだけを確認してください。ashxファイルを利用している場合は、aspxファイルと同様の設定をhttpHandlers
セクションに対して行ってください。
まとめ
この手順は、ASP.NETの仕組みについて調べていく中で思いついたアイデアをいろいろ試してみて、うまくいった結果をまとめたものです。そのため、すべての場合について確実に動作すると断言することはできません。この手順で問題が生じた場合は、ご報告いただけるとありがたいです。