ASP.NET ルーティング (ASP.NET Routing)

ここでは .NET Framework 3.5 の環境でルーティングを利用するときの、設定方法、コードの書き方などを説明します。

.NET Framework 4 以降を利用する場合は、次のページを参照してください:

» MapPageRoute を利用した ASP.NET ルーティング

ASP.NET ルーティング (ASP.NET Routing) とは?

URL を書き換えるスクリプト側の仕組み

IIS のモジュールでは Rewrite モジュールなどで URL を書き換えるのが一般的 (Apache なら mod_rewrite) ですが、 ASP.NET ルーティング (ASP.NET Routing) はスクリプトに入ってきてから URL を通常マップされるスクリプトと異なるスクリプトに渡します。

ASP.NET MVC にてこの仕組みが活躍しています。

.NET Framework 3.5 SP1 以上が必要

ASP.NET ルーティングを利用するには .NET Framework 3.5 SP1 以上が必要です。

このため Web.Config にアセンブリの参照情報を追加しなければなりません。

Visual Studio をお使いの人は何も問題ないでしょうが、私は (今は) 使っていなかったので次のように gacutil を利用して参照に必要な情報を取得しました。

>gacutil /l | findstr Web.Routing
  System.Web.Routing, Version=3.5.0.0, Culture=neutral, 
PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL
>

上の情報を元に、次のように Web.Config を構成します。

<compilation>
	<assemblies>
		...
		<add assembly="System.Web.Routing, Version=3.5.0.0, 
			Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
	</assemblies>
</compilation>

HTTP モジュールの登録

続けて HTTP モジュールと HTTP ハンドラを登録します。

<modules runAllManagedModulesForAllRequests="true">
	<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, 
		System.Web.Routing, 
		Version=3.5.0.0, 
		Culture=neutral, 
		PublicKeyToken=31BF3856AD364E35" />
</modules>
<handlers>
	<add name="UrlRoutingHandler"
		preCondition="integratedMode"
		verb="*" path="UrlRouting.axd"
		type="System.Web.HttpForbiddenHandler, 
			System.Web, 
			Version=2.0.0.0, 
			Culture=neutral, 
			PublicKeyToken=b03f5f7f11d50a3a" />
</handlers>

以上、Syste.Web.Routing の参照設定、UrlRoutingModule の登録、UrlRoutingHandler の登録を含めると結局、 Web.Config (の最小構成) は次のようになります。

<?xml version="1.0"?>
<configuration>
	<system.web>
		<compilation debug="true">
			<assemblies>
				<add assembly="System.Web.Routing, 
						   Version=3.5.0.0, 
						   Culture=neutral, 
						   PublicKeyToken=31bf3856ad364e35"/>
			</assemblies>
		</compilation>
		<authentication mode="Windows"/>
	</system.web>
	<system.codedom>
		<compilers>
			<compiler language="c#;cs;csharp" 
				extension=".cs" 
				warningLevel="4" 
				type="Microsoft.CSharp.CSharpCodeProvider, 
					  System, 
					  Version=2.0.0.0, 
					  Culture=neutral, 
					  PublicKeyToken=b77a5c561934e089">
				<providerOption name="CompilerVersion" value="v3.5"/>
				<providerOption name="WarnAsError" value="false"/>
			</compiler>
		</compilers>
	</system.codedom>
	<system.webServer>
		<modules>
			<add name="UrlRoutingModule"
		             type="System.Web.Routing.UrlRoutingModule, 
		                   System.Web.Routing, Version=3.5.0.0, 
		                   Culture=neutral, 
		                   PublicKeyToken=31BF3856AD364E35" />
		</modules>
		<handlers>
			<add name="UrlRoutingHandler"
	            preCondition="integratedMode"
	            verb="*" path="UrlRouting.axd"
	            type="System.Web.HttpForbiddenHandler, 
	                  System.Web, Version=2.0.0.0, Culture=neutral, 
	                  PublicKeyToken=b03f5f7f11d50a3a" />
		</handlers>
	</system.webServer>
</configuration>

実行サンプルの作成

ここでは、/employee/{name}/{email} という形式の URL を要求したときに、 DisplayEmployee.aspx という aspx にリクエストがルーティングされ、 最終的に次のように表示されるようなコードを書き、ASP.NET ルーティングの動作を確認しましょう。

尚、私の環境は Windows Server 2008 .NET Framework 3.5 SP1 (x64) です。

global.asax でルーティング情報の登録を行う

global.asax の Application_Start にて、次のようにルーティングテーブルに対して、ルーティングオブジェクトを登録します。

protected void Application_Start(object sender, EventArgs e)
{   
     RouteTable.Routes.Add(
          "Employee",
          new Route("employee/{name}/{email}", 
                 new EmployeeRouteHandler(
                 "~/DisplayEmployee.aspx")
          )
     );
     
}

ここでは、"employee/{name}/{email}" という形式の URL を、 "~/DisplayEmployee.aspx" にマップするような Route オブジェクトである、 EmployeeRouteHandler を作成しています。

Route オブジェクトの生成 ~ IRouteHandler インターフェイスを実装

Route オブジェクトを生成するには、ルーティングする URL のパターンと IRoutingHandler インターフェイスを実装したルーティングハンドラオブジェクト (Routing Handler オブジェクト) を必要とします。

ルーティングする URL のパターンは、単純な文字列です。下の動作確認のコード内で確認してください。

IRoutingHandler インターフェイスは、次のような GetHttpHandler メソッドが一つだけあるインターフェイスです。

IHttpHandler GetHttpHandler(
     RequestContext requestContext
)

ここでは次のような EmployeeRouteHandler クラスを定義しています。

using System;
using System.Web;
using System.Web.Compilation;
using System.Web.Routing;
using System.Web.UI;


public class EmployeeRouteHandler : IRouteHandler
{

     string _Path;

     public EmployeeRouteHandler( string virtualPath )
     {
          _Path = virtualPath;
     }

     public IHttpHandler GetHttpHandler ( RequestContext ctx )
     {
          var p = BuildManager.CreateInstanceFromVirtualPath(
               _Path, 
               typeof(Page)
          ) as IEmployeeHttpHandler;

          p.Name = ctx.RouteData.Values["name"] as string;
          p.Email = ctx.RouteData.Values["email"] as string;
           
          return p;
     }
     
}

コンストラクタで仮想パスを受け取り、GetHttpHandler メソッド内にて、その仮想パスで指定された Page オブジェクトを作成しています。

Page オブジェクトを作成後、その Page オブジェクトに対していくつかのプロパティを指定しています。

Page クラス

ここでは、次のような Page クラス (の派生クラス) を定義しています (DisplayEmployee.aspx.cs)。

using System;
using System.Web.UI.WebControls;

namespace RouteTest1
{
     public partial class _DisplayEmployee : System.Web.UI.Page, IEmployeeHttpHandler
     {
          
          public string Name { get;  set; }
          public string Email { get; set; }
          
     }
}

定義からわかるように、この Page クラスは System.Web.UI.Page (つまり ASP.NET 標準の Web Page) から派生し、 IEmployeeHttpHandler という、ユーザー定義のインターフェイスを実装しています。

IEmployeeHttpHandler は次のように定義してあります。

using System;
using System.Web;

public interface IEmployeeHttpHandler : IHttpHandler
{
     string Name { get;  set; }
     string Email { get; set; }
  }

最終的な Page クラス

上で紹介した _DisplayEmployee クラスを派生して、次のように DisplayEmployee.aspx を作ります。

<%@ Page Language="C#" Src="DisplayEmployee.aspx.cs" Inherits="RouteTest1._DisplayEmployee" %>
<html>
<head>
    <title>Routing Test</title>
</head>
<body>
<table border="1">
<tr>
	<td>Name:</td>
	<td><%= Name %></td>
</tr>
<tr>
	<td>Email:</td>
	<td><%= Email %></td>
</tr>
</table>
</body>
</html>

ASP.NET の基本ですが、コードビハインドの cs ファイルで定義した Page クラスから派生して、aspx で最終的な Page クラスが作成されるのでしたね。

実行結果

上記のコードを作成し、/employee/oyama/dadosan@keicode.com/ をリクエストすると次のように、 確かに URL 内のパラメータが取得されていることがわかります。

MapRoute メソッド

ちなみに、MVC で登場する MapRoute メソッドは、MVC による拡張であり基本的な ASP.NET ルーティングのメソッドではないことに注意しましょう。

このページで作成したコードは以下からダウンロード可能です。

ASP.NET ルーティングのサンプルコードのダウンロード

».NET Framework による開発目次へ戻る

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 ASP.NET 入門