Разница между RouteCollection.Ignore и RouteCollection.IgnoreRoute? - программирование
Подтвердить что ты не робот

Разница между 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.

4b9b3361

Ответ 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;
    }
}