更新 : 2007 年 11 月
ASP.NET ルーティングを使用すると、Web アプリケーション内の物理ファイルにマップされない URL 要求を処理できます。ASP.NET ルーティングは、Dynamic Data を使用する ASP.NET アプリケーションや MVC フレームワークでは既定で有効になりますが、ASP.NET Web サイト プロジェクトでは有効になりません。そのため、ASP.NET Web サイトでルーティングを使用するには、それを有効化する手順を実行する必要があります。
ルーティングを有効にするには、アプリケーションの構成ファイルを変更してルーティング アセンブリを登録し、UrlRoutingModule クラスをモジュールとして追加する必要があります。さらに、ルートのためのカスタム ルート ハンドラを作成する必要もあります。このハンドラでは、IRouteHandler インターフェイスを実装し、要求の実際のエンドポイントとなる Web フォーム (.aspx ファイル) のインスタンスを作成します。最後に、ハンドラによって処理されるルートを定義する必要があります。このトピックでは、これらの手順を実行する方法について説明します。
この機能を紹介したビデオが用意されています。
ASP.NET Web サイト プロジェクトをルーティング用に構成するには
アプリケーションの Web.config ファイルで、assemblies 要素に ASP.NET ルーティング アセンブリを追加します。次に例を示します。
<add assembly="System.Web.Routing, Version=3.5.0.0,
Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/>
IIS 6.0 または IIS 7.0 のクラシック モードでアプリケーションを実行する場合は、httpModules 要素に UrlRoutingModule クラスを追加します。次に例を示します。
<httpModules>
<add name="UrlRoutingModule"
type="System.Web.Routing.UrlRoutingModule,
System.Web.Routing,
Version=3.5.0.0,
Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
IIS 7.0 の統合モードでアプリケーションを実行する場合は、modules 要素に UrlRoutingModule クラスを追加します。次に例を示します。
<system.webServer>
<modules>
<remove name="UrlRoutingModule" />
<add name="UrlRoutingModule"
type="System.Web.Routing.UrlRoutingModule,
System.Web.Routing,
Version=3.5.0.0,
Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/>
</modules>
</system.webServer>
IIS 7.0 の統合モードでアプリケーションを実行する場合は、handlers 要素に UrlRoutingHandler クラスを追加します。次に例を示します。
<system.webServer>
<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>
ハンドラを作成するには
IRouteHandler インターフェイスを実装するクラスを作成します。
GetHttpHandler メソッドを実装します。特定の Web フォーム (.aspx ファイル) を要求のエンドポイントとして指定するには、GetHttpHandler メソッドから Web フォームのインスタンスを返します。
IRouteHandler インターフェイスを実装する CustomRouteHandler という名前のクラスを次の例に示します。GetHttpHandler メソッドでは、CreateInstanceFromVirtualPath メソッドを呼び出して、指定された Web フォームのインスタンスを作成しています。このインスタンスが要求のエンドポイントとして返されます。
Public Class CustomRouteHandler
Implements IRouteHandler
Private _virtualPath As String
Public Sub New(ByVal vPath As String)
_virtualPath = vPath
End Sub
Public Property VirtualPath() As String
Get
Return _virtualPath
End Get
Private Set(ByVal value As String)
_virtualPath = value
End Set
End Property
Public Function GetHttpHandler(ByVal requestContext _
As System.Web.Routing.RequestContext) _
As System.Web.IHttpHandler _
Implements System.Web.Routing.IRouteHandler.GetHttpHandler
Dim redirectPage As IHttpHandler
redirectPage = _
BuildManager.CreateInstanceFromVirtualPath(VirtualPath, _
GetType(Page))
Return redirectPage
End Function
End Class
public class CustomRouteHandler : IRouteHandler
{
public CustomRouteHandler(string virtualPath)
{
this.VirtualPath = virtualPath;
}
public string VirtualPath { get; private set; }
public IHttpHandler GetHttpHandler(RequestContext
requestContext)
{
var page = BuildManager.CreateInstanceFromVirtualPath
(VirtualPath, typeof(Page)) as IHttpHandler;
return page;
}
}
カスタム ハンドラを登録するには
Web アプリケーションに Global.asax ファイルが含まれていない場合は、このファイルを追加します。
Global.asax ファイルに、System.Web.Routing 名前空間をインポートするディレクティブを追加します。次に例を示します。
<%@ Import Namespace="System.Web.Routing" %>
Global.asax ファイルに、RouteTable クラスの Routes プロパティにルート定義を追加するメソッドを作成します。
このメソッドを Application_Start イベント ハンドラから呼び出します。
次の例は、bikes/sale に一致する要求のハンドラとして、CustomRouteHandler という名前のクラスを登録するメソッドを示しています。
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
RegisterRoutes(RouteTable.Routes)
End Sub
Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.Add("BikeSaleRoute", New Route _
( _
"bikes/sale", New CustomRouteHandler("~/Contoso/Products/Details.aspx") _
))
End Sub
void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add("BikeSaleRoute", new Route
(
"bikes/sale",
new CustomRouteHandler("~/Contoso/Products/Details.aspx")
));
}
概念