by WebSurfer
2010年5月9日 17:30
このホームページのサーバーは Windows Server 2008 の IIS7 で、アプリケーションプールのマネージパイプラインモードは Integrated mode がデフォルトになっています。
一方、CodePlex のサイトにある Documentation によると、IIS7 を使用する場合、BlogEngine を運用するアプリケーションプールは "Classic .NET AppPool" にしないと、"some of the software will fail in strange ways" と書いてありました。
BlogEngine はホームページ本体とは別アプリケーションなので、自分でサーバーを運用していれば、それのみ "Classic .NET AppPool" にするのは簡単ですが、レンタルサーバーではどうしようもありません(念のため、できないか聞いてみましたが、ダメとのこと)。
Microsoft の MSDN ライブラリの ASP.NET と IIS 7 の統合 などを読んで、対応方法を検討してみました。
それを見ると、問題は web.config における HttpModule と HttpHandler の定義方法のようです。要するに、<system.web> セクションの <httpModules> と <httpHandlers> 内に定義してはダメで、すべて <system.webServer> セクションの <modules> と <handlers> 内に移す必要があるということのようです。
実際に、<system.web> セクションの <httpModules> と <httpHandlers> 内のみに HttpModule と HttpHandler を定義すると、上の写真のようなエラーになります。
対処方法としては、MSDN ライブラリや写真のエラーメッセージに書いてあるように、appcmd.exe migrate config コマンドを実行するのがよさそうですが、レンタルサーバーではどうしようもありません。
仕方がないので、自分の PC でコマンドを走らせて web.config がどのように修正されるか調べ、それに従って手動でサーバーにある web.config を書き換えることにしました。
で、結論から言うと、BlogEngine.NET 1.6.1 の場合、web.config はすでにコマンドを走らせたのと同様な形に対応済みで、修正の必要はなかったです。
というわけで、BlogEngine.NET 1.6.1 は web.config の修正なしで IIS7 Integrated mode で動くということと理解しました。(これだけの対応で本当に済むのかどうかはまだちょっと疑問ですが・・・(汗))
ちなみに、appcmd.exe を走らせると web.config がどのように変わるかというと、<system.webServer> およびその中に <modules> と <handlers> が追加され、<system.web> セクションで定義されている HttpModule と HttpHandler がコピーされます。また、<validation validateIntegratedModeConfiguration="false" /> も追加されます。
要するに、Visual Studio 2008 がデフォルトで作る web.config と同じような内容になるということです。苦労して調べたのに、なんのこっちゃ・・・という感じです。(笑)