ページ

2010年7月29日木曜日

[ASP.NET] ASP.NET 4 と ASP.NET 1.x/2.0 を混在させる

最近 (ASP.NET 4 から?) は複数のバージョンの ASP.NET を一つの Web サイトでホストできるということで、それをやってみようとしたときの記録です。

サイトの構成を以下のようにしようとしました。

もともと .Text (C# で書かれたブログエンジン) が動いているところの親フォルダを ASP.NET 4 にしてみようとしたわけです。
OS は Windows Server 2003 の IIS6 です。
.NET Framework 4 をインストールしたらいつの間にか /blog/ の方も 4 になっていたので、以下の手順でマルチバージョンにしました。

  1. IIS マネージャの 「アプリケーションプール」 を右クリックして v1Pool という名前のプールを新規作成。
  2. IIS マネージャで仮想フォルダ blog を右クリックしてプロパティで 「アプリケーションプール」 を v1Pool に、「ASP.NET バージョン」 を 1.1.4322 にした。
  3. (ルートの方は始めから「アプリケーションプール」 が DefaultAppPool、「ASP.NET バージョン」 が 4.0.30319 になっていたのでそのまま)

ひとつのアプリケーションプールに違うバージョンを入れることはできません。マルチバージョンにしたいときはこのようにバージョン別にアプリケーションプールを作ってやれば OK です。

が、ここで問題発生。
blog フォルダの方は勝手に親フォルダの web.config を見にいっちゃうんですね。
もちろん、blog フォルダは Web アプリケーションにしてあるので独自に web.config を持ってるんですが、実行時に勝手に親フォルダの web.config も内容がチェックされてしまいます。
それで、親フォルダは ASP.NET 4 になってるので web.config も ASP.NET 4 のものになっています。それを ASP.NET 1.1 としてチェックしてしまうため (blog フォルダは ASP.NET 1.1 だから)「connectionString なんて知らね」 「targetFramework なんて知らね」 とかって感じで web.config が不正だというエラーになってしまいます。
この、親フォルダの web.config までチェックしにいっちゃうのって止められるんでしょうか?
ちょっと調べてみたところでは止め方がわかりませんでした。
今回の場合は、親フォルダは特に web.config に書かなくちゃいけないことは無かったので、中身をばっさりと削除して ASP.NET 1.1 と非互換な部分が無くなるようにしちゃいました。その結果、親フォルダの web.config のせいでエラーになることは無くなりました。

そして、次の問題が発生。
.Text では http://www.divakk.co.jp/blog/aoyagi/ のようにアクセスできるようになっています。aoyagi という名前のフォルダは実在しないのですが、うまいことマッピングして処理するようになっているんです。
ところが、実際にアクセスしてみると 「eurl.axd/xxxxxxxxxxxxxxxxxx が見つからない」 とかっていうエラーになります。
検索してみるとどうやらこちら。
http://www.asp.net/learn/whitepapers/aspnet4/breaking-changes#0.1__Toc256770153
(日本語は [PDF]ASP.NET 4 の互換性に影響する変更点
一部抜粋してみると、

ASP.NET 4 を使うように構成されていると、拡張子なしの URL に eurl.axd を追加してしまう。ASP.NET 2.0 は eurl.axd を認識しないのでファイルが存在しないという例外が発生する。

ということだそうです。
解決法も書いてあるんですが、

  1. ASP.NET 4 を使うのをやめる
  2. ASP.NET 2.0 だけのサイトを別に作る
  3. レジストリを書き換えて eurl.axd を使わないようにする

うーむ。
今回は 3 の eurl.axd を使わないようにして対処しました。

一応、最初に意図した構成にはできましたが、ちょっとなんだかなぁという感じです。
ASP.NET のバージョンを混在させるのはいろいろと落とし穴がありそうですね。

1 件のコメント:

  1. http://dotnetfan.org/blogs/dotnetfanblog/archive/2008/06/11/2775.aspx

    上位のweb.configでinheritInChildApplications ="false"としてやると下位に構成情報がわたらないそうです。

    返信削除