更新 : 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") )); }