ASP.NETルーティング解析
14844 ワード
この間、園の中でArtech大神の『ASP.NET MVC 5フレームの暴露』を読んで、MVCモードの設計構想を徐々に底から理解しました.以下はいくつかの読書のまとめです.
従来のWeb Formsアプリケーションでは、URLは具体的な物理ファイルを指すが、ASP.NET MVCアプリケーションは、一般に、あるController内のアクションメソッドを指す.URLとターゲットController/Actionとのマッピング関係は「ルーティング」によって実現される.
ルーティングシステムのいくつかのコアクラスの説明:
RouteBase抽象ベースクラス.
RouteDataは、ルーティングに関する情報をカプセル化する. RouteDataは、RouteHandlerプロパティを使用してRouteHandlerオブジェクトを返します. RouteHandlerは、IrouteHandlerのGetHttpHandler(RequestContext requestContext)を実装し、httpリクエストを受け取るHttpHandlerオブジェクトを返します.
VirtualPathDataは、ルーティングおよび仮想パスに関する情報を表す. RouteBaseを実行するGetVirtualPath()は、ルーティングテンプレートのプレースホルダにルーティング変数を置き換え、仮想パスを生成するルーティングマッチングを行います. は、仮想パスとRouteのパッケージです.
Routeは、ルーティングを定義し、ルーティング関連情報を取得するための属性および方法を提供する. ルーティングは、ルーティングテーブル内の特定のルートオブジェクトによって行われる.
RouteTableは、アプリケーションのURLルーティングを格納する. 静的読取り専用プロパティRoutesは、グローバルルーティングテーブルにアクセスします.
RouteCollection Routeのセットで、Routeを操作します. RouteCollectionのGetRouteDataとGetVirtualPathを呼び出すと、コレクション内のすべてのRouteが巡回します. でよく使われる2つの方法.MapPageRoute:ルーティングを登録します.Ignore:対応するURLフォーマットを無視します.
クラス間の関係をまとめます.
Routeオブジェクトは、実際のルーティングルールを表します.Routeオブジェクトの2つのルーティングマッチングメソッドを呼び出すとルーティング解析が行われ、返されるRouteDataまたはVirtualPathDataはRouteのパッケージです.RouteTableは、Webアプリケーションのグローバルルーティング情報、すなわち複数のRouteオブジェクトを格納する.
ルーティング登録 MVC 4におけるデフォルトのルーティング登録 書における制約付き登録方式
正規コンストレイントは比較的簡単な方法であり、カスタムコンストレイントで実現することもできます.IrouteConstraintのMatchメソッドを実装します.
IrouteConstraintでIEブラウザへのアクセスを制限するとします.
注意:カスタムルーティング制約の詳細については、次の手順に従います.http://www.cnblogs.com/xfrog/archive/2010/12/19/1910428.html.この例もこの博文から選択される.
HTTPリクエストからルーティング解析へ URLRoutingModuleはIHttpModuleから派生した.HttpApplicationのPostResolveRequestCacheイベントを登録します. HttpApplicationオブジェクトがイベントをトリガーした後、URLRoutingModuleはRouteTableの静的読取り専用属性RouteaによってグローバルなルーティングテーブルのRouteCollectionオブジェクトを取得し、現在のコンテキストに基づいてHttpContextWrapperオブジェクト(HttpContextBaseから派生)を作成し、これをパラメータとしてRouteCollectionオブジェクトのGetRouteDataメソッドを呼び出す. ルーティングが正常に一致すると、特定のRouteDataオブジェクトが返されます. URLRoutingModuleは、RouteDataオブジェクトのRouteHandlerにHttpContextWrapperを転送します.GetHttpHandlerメソッドを呼び出し、特定のHttpHandlerを得る.URLRoutingModuleは、得られたHttpHandlerをマッピングするために、HttpContextWrapperオブジェクトのRemapHandlerメソッドを最後に呼び出す. 解析が完了し、現在のHTTPリクエストに対してこのHandlerが引き継ぐ.
注:本博文の多くの内容は「ASP.NET MVC 5フレームワークの暴露」から来ており、内容の整理と総括を行うだけです.
従来のWeb Formsアプリケーションでは、URLは具体的な物理ファイルを指すが、ASP.NET MVCアプリケーションは、一般に、あるController内のアクションメソッドを指す.URLとターゲットController/Actionとのマッピング関係は「ルーティング」によって実現される.
ルーティングシステムのいくつかのコアクラスの説明:
RouteBase
public abstract class RouteBase
{
//.NET Framwork4.5 ( )
public bool RouteExistingFiles { get; set; }
//
public abstract RouteData GetRouteData(HttpContextBase httpContext);
//
public abstract VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values);
}
RouteData
public class RouteData
{
public RouteData();
public RouteData(RouteBase route, IRouteHandler routeHandler);
public string GetRequiredString(string valueName);
public RouteBase Route { get; set; }
public IRouteHandler RouteHandler { get; set; }
public RouteValueDictionary DataTokens { get; }
public RouteValueDictionary Values { get; }
}
VirtualPathData
public class VirtualPathData
{
public VirtualPathData(RouteBase route, string virtualPath);
public RouteValueDictionary DataTokens { get; }
public RouteBase Route { get; set; }
public string VirtualPath { get; set; }
}
Route
public class Route : RouteBase
{
public Route(string url, IRouteHandler routeHandler);
public Route(string url, RouteValueDictionary defaults, IRouteHandler routeHandler);
public Route(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler);
public Route(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler);
// ( )
public RouteValueDictionary Constraints { get; set; }
// ,
public RouteValueDictionary DataTokens { get; set; }
public RouteValueDictionary Defaults { get; set; }
public IRouteHandler RouteHandler { get; set; }
public string Url { get; set; }
public override RouteData GetRouteData(HttpContextBase httpContext);
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values);
}
RouteTable
public class RouteTable
{
public static RouteCollection Routes { get; }
}
RouteCollection
クラス間の関係をまとめます.
Routeオブジェクトは、実際のルーティングルールを表します.Routeオブジェクトの2つのルーティングマッチングメソッドを呼び出すとルーティング解析が行われ、返されるRouteDataまたはVirtualPathDataはRouteのパッケージです.RouteTableは、Webアプリケーションのグローバルルーティング情報、すなわち複数のRouteオブジェクトを格納する.
ルーティング登録
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
public static void RegisterRoutes(RouteCollection routes)
{
//
var defaults = new RouteValueDictionary{
{"areacode","010"},{"days",2}};
//
var constaints = new RouteValueDictionary {
{"areacode",@"0\d{2,3}"},{"days",@"[1-3]{1}"}};
//
var dataTokens = new RouteValueDictionary{
{"defaultCitr\y","BeiJing"},{"defaultDays",2}};
routes.MapPageRoute("default","{areacode}/{}days","~/weather.aspx"
,false,defaults,constaints,dataTokens);
}
正規コンストレイントは比較的簡単な方法であり、カスタムコンストレイントで実現することもできます.IrouteConstraintのMatchメソッドを実装します.
IrouteConstraintでIEブラウザへのアクセスを制限するとします.
public class IERouteConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return !(httpContext.Request.UserAgent.Contains("MSIE"));
}
}
//
var constaints = new RouteValueDictionary {
{"areacode",@"0\d{2,3}"},{"days",@"[1-3]{1}"},new IERouteConstraint()};
注意:カスタムルーティング制約の詳細については、次の手順に従います.http://www.cnblogs.com/xfrog/archive/2010/12/19/1910428.html.この例もこの博文から選択される.
HTTPリクエストからルーティング解析へ
注:本博文の多くの内容は「ASP.NET MVC 5フレームワークの暴露」から来ており、内容の整理と総括を行うだけです.