ASP.NETルーティング解析

14844 ワード

この間、園の中でArtech大神の『ASP.NET MVC 5フレームの暴露』を読んで、MVCモードの設計構想を徐々に底から理解しました.以下はいくつかの読書のまとめです.
従来の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
  • は、ルーティングに関する情報をカプセル化する.
  • RouteDataは、RouteHandlerプロパティを使用してRouteHandlerオブジェクトを返します.
  • RouteHandlerは、IrouteHandlerのGetHttpHandler(RequestContext requestContext)を実装し、httpリクエストを受け取るHttpHandlerオブジェクトを返します.
  •     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
  • は、ルーティングおよび仮想パスに関する情報を表す.
  • RouteBaseを実行するGetVirtualPath()は、ルーティングテンプレートのプレースホルダにルーティング変数を置き換え、仮想パスを生成するルーティングマッチングを行います.
  • は、仮想パスとRouteのパッケージです.
  • 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
  • は、アプリケーションのURLルーティングを格納する.
  • 静的読取り専用プロパティRoutesは、グローバルルーティングテーブルにアクセスします.
  • public class RouteTable
    {
        public static RouteCollection Routes { get; }
    }

    RouteCollection
  • Routeのセットで、Routeを操作します.
  • RouteCollectionのGetRouteDataとGetVirtualPathを呼び出すと、コレクション内のすべてのRouteが巡回します.
  • でよく使われる2つの方法.MapPageRoute:ルーティングを登録します.Ignore:対応するURLフォーマットを無視します.

  • クラス間の関係をまとめます.
    Routeオブジェクトは、実際のルーティングルールを表します.Routeオブジェクトの2つのルーティングマッチングメソッドを呼び出すとルーティング解析が行われ、返されるRouteDataまたはVirtualPathDataはRouteのパッケージです.RouteTableは、Webアプリケーションのグローバルルーティング情報、すなわち複数のRouteオブジェクトを格納する.
    ルーティング登録
  • MVC 4におけるデフォルトのルーティング登録
  •    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リクエストからルーティング解析へ
  • 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フレームワークの暴露」から来ており、内容の整理と総括を行うだけです.