2011年1月16日日曜日

WebMatrixのWebPagesで拡張子が無くてもアクセス出来る理由

タイトル長い。地獄のミサワネタが他人ごとに思えない今日この頃。

WebMatrixでごそごそ遊んでると、何気にページアクセスする際の拡張子指定が無くてもいけることに気が付きますよね。

スターターサイトで試すよー。みんなー、用意はいいかーい?ちなみにWebPagesのソースコードを追いかけてるのでチャラさが足りないエントリですいません。

例えば以下のページ。アドレスバーには”/default.cshtml”って入れて表示した場合ですね。普通です。

ext1

続いて"/default"。同じように表示されますね。拡張子cshtmlは指定してないですね。

ext2

なぜでしょ~か?答えはソースコード中にあり。System.Web.WebPages\WebPageHttpHandler.csとSystem.Web.WebPages\WebPageRoute.csを覗いてみましょう。

WebPageHttpHandlerにGetRegisteredExtensions()とRegisterExtension()が有りまして、これが拡張子を登録したり取り出したりできるやつです。んで、WebPageRouteのほうでそれを見つつ、VirtualPathProvider経由でファイルの存在確認をして、無ければ補完するという処理をしています。これらHttpHandlerとRouteの指定はPreApplicationStartCodeだったり、WebPageHttpModuleだったりです。詳しくはDeep Diveになっちゃうのでソースを見てみるといいかな~、なんて思います。

ソース見ただけじゃよくわんな~い、というかわいこちゃんにお勧めなのがテストプロジェクトを動かしてみるという方法。VS2010必要だけどね。System.Web.WebPages.Test.WebPageRouteTestを眺めつつ、デバッグ実行して追いかけてみると、挙動が分かりやすくていいです。なぜProviderが必要なのか、なぜDIなのか、なんていうのもテストするとよく分かりますよね。

ext7

DynamicModuleUtility.RegisterModuleて誰やねん!的な。ソースないし。まぁ、普通にASP.NETの仕組みだということです。

ext6

つまり、cshtmlとvbhtmlはURLに指定しなくても勝手に補完してくれるので、安心して省略してしまってもいいですよ、っていうことです。VirtualPathProviderがちゃんとキャッシュしてくれてるので2回目以降はちょっと早そう。そのくらい誤差の範囲でネットのほうが桁違いに遅いんだしいいんじゃないの、って思うけど妥協無しデス。

続きまして、ちょっと変わり種。今度は”/”だけ。それでもちゃんと表示されますね。

ext3

なぜかというと、これもまた補完機能が働くからです。今度はどこで?いったい誰が!?

WebPageRouteです。一緒です。はい。

ファイル名指定が無い場合(サブフォルダも含むよ)、”default”→”index”の順に補完しつつ、拡張子も”cshtml”→”vbhtml”で補完されることで見つかります。

試しに以下のように”~/index.cshtml”を作成してみましょう。

<!DOCTYPE html>

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>インデックス</title>
    </head>
    <body>
        <h1>index.cshtmlなんだぜ!</h1>
    </body>
</html>

“/index”と入れてアクセスすると普通に見れます。

ext4

この状態で、"default.cshtml”を違うファイル名変えて見ましょう。何でもいいです。

んで、"/"にアクセスすると、ちゃんと”default.cshtml”じゃなくて”index.cshtml”の内容が表示されました。

ext5

つまり、初期表示したいファイル名はdefault.cshtml(vbhtml)かindex.cshtml(vbhtml)固定ということですよ。もちろんRoutingとかに手を出せばいけるかもしれないけど、どーだろね。タイミング的に間に合わないかもね。相手はModuleだし。

Thoughts on WebMatrix

そんなことを思ってたら上記エントリを発見。そうだね。URL Rewriteモジュール使えば何とでもなるね、きっと。たぶん処理も間に合う気がする。試してないけど。

WebMatrixでサイトを作成する場合、こんな仕組みで動くのを覚えておくといいと思うよ~。

20100218_1708335