水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > 2010年のえび日記 > 2010年7月 > 2010年7月29日(木曜日)

2010年7月29日(木曜日)

URLに%22が含まれても何とかする方法

公開: 2010年7月31日12時25分頃

URLに%22が含まれると例外が出る問題ですが、この解決方法だとリダイレクトが重複してスマートでないのはもちろんのこと、いったん例外が出た後でエラー画面からリダイレクトするという方法であるため、例外が出ること自体は避けられていません。そのため、イベントログに例外の記録が残ってしまいます。

というわけで、もっとスマートな方法を模索してみました。

URLに %22 が含まれるときの例外は HttpApplication が出しているのですが、HttpApplication の説明にはこうありまして……。

HttpApplication クラスのインスタンスは、開発者が直接作成するのではなく、ASP.NET インフラストラクチャで作成されます。

以上、HttpApplication クラス (System.Web) より

そもそも自由にインスタンスを作ったりできないので、カスタマイズした別のクラスのインスタンスに差し替えたりすることはできなさそうです。しかしよく説明を読むと、カスタムHttpModuleを作成してイベントを受け取ることができるようなことが書かれています。

というわけで、早速実行してみました。こんな感じの簡単なコードを書いて……。

namespace Bakera.Hatomaru {
    public class HatomaruUrlCheckModule : IHttpModule {
        public HatomaruUrlCheckModule(){}
        public void Init(HttpApplication app) {
            app.BeginRequest += new EventHandler(app_BeginRequest);
        }
        public void app_BeginRequest (object o, EventArgs ea) {
            HttpApplication httpApp = (HttpApplication)o;
            // URLを見て変な文字があったらリダイレクトする処理
            // リダイレクトする場合は httpApp.CompleteRequest(); を呼ぶ
        }
        public void Dispose(){}
    }
}

web.config側にはこんな設定を追加。

<httpModules>
    <add type="Bakera.Hatomaru.HatomaruUrlCheckModule" name="HatomaruUrlCheckModule" />
</httpModules>

これで例外を出さずにリダイレクトできるようになりました。

やってみればけっこう柔軟に対応できるものですね。

関連する話題: C# / .NET / ASP.NET / IIS / プログラミング / hatomaru.dll

最近の日記

関わった本など