ASP.NET MVC RouteのWebFormルーティングとソースコード分析(二)

8080 ワード

前言
前編では、WebFormルーティングとソースコードの分析を紹介し、WebFormでルーティングと物理ファイルの論理的分離をどのように使用するかを一例で紹介した.Netはどのように対応する物理ファイルを見つけますか?次に、ソースコードで分析します.
ソース分析
アクセスするURLアドレスを入力と、要求はASPに入る.NETのパイプハンドラです.これは、RouteCollectionコレクションを巡って、現在のリクエストに合致するルートを見つけて返します.
次はRouteCollectionです.csのGetRouteDataメソッドコード:
public RouteData GetRouteData(HttpContextBase httpContext)
        {
            if (httpContext == null)
            {
                throw new ArgumentNullException("httpContext");
            }
            if (httpContext.Request == null)
            {
                throw new ArgumentException(SR.GetString("RouteTable_ContextMissingRequest"), "httpContext");
            }
            if (base.Count == 0)
            {
                return null;
            }
            bool flag = false;
            bool flag2 = false;
            if (!this.RouteExistingFiles)
            {
                flag = this.IsRouteToExistingFile(httpContext);
                flag2 = true;
                if (flag)
                {
                    return null;
                }
            }
            using (this.GetReadLock())
            {
                foreach (RouteBase current in this)
                {
                    RouteData routeData = current.GetRouteData(httpContext);
                    if (routeData != null)
                    {
                        RouteData result;
                        if (!current.RouteExistingFiles) //        ,   True
                        {
                            if (!flag2)
                            {
                                flag = this.IsRouteToExistingFile(httpContext);
                                flag2 = true;
                            }
                            if (flag)
                            {
                                result = null;
                                return result;
                            }
                        }
                        result = routeData;
                        return result;
                    }
                }
            }
            return null;
        }

上記の赤色コードは、RouteCollectionの各ルートを巡ってhttpcontextをパラメータとしてRouteクラスのGetRouteData()メソッドを呼び出し、一致するRoute情報を取得し、RouteCollectionセットに現在のURLに合致するRouteがある場合はすぐに戻り、そうでない場合はNULLとする.次に、RouteのGetRouteData()ソースコードを見てみましょう.
public override RouteData GetRouteData(HttpContextBase httpContext)
{
    string virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;
    RouteValueDictionary routeValueDictionary = this._parsedRoute.Match(virtualPath, this.Defaults); //     ,  url
    if (routeValueDictionary == null)
    {
        return null;
    }
    RouteData routeData = new RouteData(this, this.RouteHandler); if (!this.ProcessConstraints(httpContext, routeValueDictionary, RouteDirection.IncomingRequest))//    
    {
        return null;
    }
    foreach (KeyValuePair<string, object> current in routeValueDictionary)
    {
        routeData.Values.Add(current.Key, current.Value);
    }
    if (this.DataTokens != null)
    {
        foreach (KeyValuePair<string, object> current2 in this.DataTokens)
        {
            routeData.DataTokens[current2.Key] = current2.Value;
        }
    }
    return routeData;
}

RouteオブジェクトのGetRouteDataメソッドは、URLモードと制約条件をチェックし、一致しない場合nullを返します.一致する場合、newは1つのRouteData