宇宙仮面のC# プログラミング

 

ImageURLのリダイレクト

開発環境: Visual Studio 2005 

1.目次

1.目次
2.目的
3.参考書
4.URL リダイレクトの実現方法
5.HttpModule を利用する方法
5. 1 Web.Config へのHttpModule を追加する。
5.2 HttpModuleを実装する。
5.3 HttpModule を利用する場合の注意
6.HttpHandler を利用する方法

2.目的

ASP.NET 2.0で、URLをリダイレクトする方法について。

"http://uchukamen.com/Default.aspx?category=csharp & sub = UrlRedirect" なんて、見にくいですよね。このようなURLではなく、"http://uchukamen.com/csharp/UrlRedirect/" というように指定できるとうれしい場合があります。このようなURLを書き換えることを URL Redirectと言いますが、この方法について説明します。

3.参考書

  1. MSDN: ASP.NET での URL 書き換え
  2. ASP.NET 2.0: URL Mapping with RegEx Support
  3. ASP.NET 2.0: Rewriting URL Paths just got a whole lot easier

4.URL リダイレクトの実現方法

URLリダイレクトを行う方法には、2つあります。1つが、HttpModuleで書き換える方法と、もう1つが、HttpHandlerで書き換える方法です。この2つの方法のメカニズムを理解し、どちらで実装するか検討する必要があります。この説明に関しては、参考書(1)が詳しいです。

一応、概念図を下に示します。HTTPリクエストがIISに入り、.NETのモジュールが必要な場合には、まずASP.NETエンジンに渡され、適切なHTTPモジュールの処理が行われます。次にHTTPハンドラで最終的な処理が行われ、その結果がレスポンスとして返されるように動作します。

Image

URLのリダイレクトを行う場所としては、(1)HttpModuleを追加する。(2)Httpハンドラを実装する。の2つがあります。

5.HttpModule を利用する方法

HttpModuleを利用するには、次のようにします。

(1) Web.Config に URLを書き換える HttpModule を定義する。
(2) IHttpModule を実装するアセンブリ (HttpModule) を配置する。

5.1 Web.Config へのHttpModule を追加する。

Web.Config で、HttpModule を定義します。system.web ブロックに、次のように IHttpModuleを実装するアセンブリ(ここでは、Uchukamen.Web.UrlRedirectModule)を指定します。これにより、このWeb.Config 以下のページに対して、IHttpModule を実装するアセンブリが呼び出されます。

Web.Config
<?xml version="1.0"?>
<
configuration>
  <
appSettings/>
  <
connectionStrings/>
  <
system.web>

    <
httpModules>
      <
add name="UrlRedirectModule" type="Uchukamen.Web.UrlRedirectModule"/>
    </
httpModules>

    <
compilation debug="true"/>

    <
authentication mode="Windows"/>
  </
system.web>
</
configuration>

5.2 HttpModuleを実装する。

ソリューションに、クラスライブラリプロジェクトを追加し、IHttpModuleインターフェイスを実装するモジュールを作成します。IHttpModuleインターフェースでは、Init, Dispose を実装する必要があります。次のコードが Url をリダイレクトする最低限のコードです。ここでは、Default.aspx を RedirectedPage.aspx へ無条件にリダイレクトしています。

UrlRedirectModle.cs
using System;
using
System.Web;

namespace Uchukamen.Web
{
 
public class UrlRedirectModule : IHttpModule
 
{
    
public void Init(HttpApplication application)
      {
        application.BeginRequest +=
new EventHandler
                                
( this.OnBeginRequest );
      }

   
private void OnBeginRequest(Object source, EventArgs e)
    {
     
HttpApplication application = (HttpApplication)source;
       
if(application.Request.Url.AbsoluteUri.EndsWith("default.aspx"))
          application.Response.Redirect(
"~/RedirectedPage.aspx");
    }

   
public void Dispose()
    {
    }
  }
}

5.3 HttpModule を利用する場合の注意

HttpModuleでは、次の順番にイベントが発生します。URLをリダイレクトする際には、どのイベントでリダイレクト処理をするかによって、認証、承認プロセスの対象URLが書き換えられてしまいます。

イベント発生順序 イベント 注意制限事項
1 BeginRequest リダイレクトされたURLに対してフォーム認証が行われる。
2 AuthenticateRequest リダイレクトされたURLに対してAuthenticationが行われる。
3 AuthorizedRequest リダイレクトされたURLに対してAuthorizationが行われる。

たとえば、BeginRequest イベントで書き換えを行った場合、認証が必要なAuthorize.aspx というURLを 認証を必要としない Redirected.aspx に書き換えてしまうと、認証が行われないことになってしまいます。

6.HttpHandler を利用する方法

HttpHandler を使用する場合には、次のように Web.Config ファイルのconfiguration/system.web セクションに次のようにhttpHandlers タグを追加します。そして、IHttpHandlerFactory インターフェイスを実装するアセンブリを作成し、配置します。

Web.Config
<httpHandlers>
<add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHndler, URLRewriter" />
</httpHandlers>

この方法は未確認です。HttpModule を使う場合とHttpHandlerを使う場合のメリット、デメリットも参考書(1)からは良くわかりません。

ただ、4章の図の処理プロセスを考えると、URLのリダイレクトのような個別の処理はHttpModuleに実装するのが適切のような気がします・・・