18

RouteCollection.Ignore(url, constraints)とはどう違いRouteCollection.IgnoreRoute(url, constraints)ますか?

バックグラウンド

新しい MVC プロジェクトには、このIgnoreRoute呼び出しが Global.asaxRegisterRoutesメソッドに含まれており、ASP.NET システムの他の場所で処理される .axd の場所への要求のルーティングをスキップします。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

プロジェクトに無視されたルートを追加したかったので、新しい行を入力し始めました。の後、インテリセンスがとでroutes.Iポップアップしますが、どちらもほぼ同じように聞こえます。.Ignore.IgnoreRoute

System.Web.Routing.RouteCollectionMSDN ドキュメントによると、1 つはクラスのインスタンス メソッドであり、もう 1 つはそのクラスの拡張メソッドであることがわかりますSystem.Web.Mvc.RouteCollectionExtensions

  • RouteCollection.Ignore: 「リクエスト URL が指定された制約を満たしている場合、ルートとの一致をチェックしない URL パターンを定義します」( MSDN ドキュメント)。
  • RouteCollection.IgnoreRoute: 「指定された使用可能なルートのリストと制約のリストに対して、指定された URL ルートを無視します」( MSDN ドキュメント)。

どちらも、ルート URL パターンと、その URL パターンでのルートの適用を制限する一連の制約を取ります。

4

1 に答える 1

20

CodePlexソースとSystem.Web.Mvc.RouteCollectionExtensions、私のローカル GAC で少しILSpySystem.Web.Routing.RouteCollectionを実行している間に、同じことを行う完全に独立したコードがあるように見えますが、違いはないようです。

RouteCollection.IgnoreRoute( CodePlex ソース経由)

public static void IgnoreRoute(this RouteCollection routes, string url, object constraints) {
    if (routes == null) {
        throw new ArgumentNullException("routes");
    }
    if (url == null) {
        throw new ArgumentNullException("url");
    }

    IgnoreRouteInternal route = new IgnoreRouteInternal(url) {
        Constraints = new RouteValueDictionary(constraints)
    };

    routes.Add(route);
}

RouteCollection.Ignore(ILSpy デコンパイル経由)

public void Ignore(string url, object constraints) {
    if (url == null) {
        throw new ArgumentNullException("url");
    }
    RouteCollection.IgnoreRouteInternal item = new RouteCollection.IgnoreRouteInternal(url) {
        Constraints = new RouteValueDictionary(constraints)
    };
    base.Add(item);
}

違い

唯一の実際の違いは、場所の明らかな違いです。1 つはRouteCollectionクラス自体のインスタンス メソッドであり、もう 1 つはそのクラスの拡張メソッドです。インスタンスと拡張機能の実行によるコードの違い (拡張インスタンスでの重要な null チェックなど) を考慮すると、それらは同一に見えます。

基本的に、両者はまったく同じStopRoutingHandlerクラスを使用しています。どちらにも独自のシールIgnoreRouteInternalクラスがありますが、これらのバージョンのコードは同じです。

private sealed class IgnoreRouteInternal : Route {
    public IgnoreRouteInternal(string url)
        : base(url, new StopRoutingHandler()) {
    }
    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary routeValues) {
        return null;
    }
}
于 2012-07-18T14:58:55.603 に答える