Разница между RouteCollection.Ignore и RouteCollection.IgnoreRoute?

В чем разница между RouteCollection.Ignore(url, constraints) а также RouteCollection.IgnoreRoute(url, constraints)?

Фон

Новые проекты MVC включают это IgnoreRoute позвонить в Global.asax RegisterRoutes метод для пропуска маршрутизации запросов к местоположениям.axd, которые обрабатываются в других местах системы ASP.NET.

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

Я хотел добавить дополнительный игнорируемый маршрут к проекту, и я начал печатать новую строку. После routes.I, Intellisense всплывает с .Ignore а также .IgnoreRouteоба звучат примерно одинаково.

Согласно документам MSDN, вы можете видеть, что один из них является методом экземпляра System.Web.Routing.RouteCollection класс, а другой метод расширения этого класса из System.Web.Mvc.RouteCollectionExtensions,

  • RouteCollection.Ignore: "Определяет шаблон URL, который не следует проверять на совпадения с маршрутами, если URL запроса соответствует указанным ограничениям" ( документы MSDN).
  • RouteCollection.IgnoreRoute: "Игнорирует указанный URL-маршрут для данного списка доступных маршрутов и списка ограничений" ( документы MSDN).

Оба принимают шаблон URL-адреса маршрута и набор ограничений, ограничивающих применение маршрута к этому шаблону URL-адреса.

1 ответ

Между источником для System.Web.Mvc.RouteCollectionExtensions на CodePlex и запуска небольшого ILSpy на моем местном GAC для System.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);
}

Различия

Единственная реальная разница - это очевидная разница в расположении, один из которых является методом экземпляра в RouteCollection сам класс и один метод расширения для этого класса. После учета различий в коде, возникающих при выполнении экземпляра и при расширении (например, при проверке жизненного нуля в расширенном экземпляре), они кажутся идентичными.

По своей сути они оба используют одно и то же 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;
    }
}
Другие вопросы по тегам