18

RouteCollection.Ignore(url, constraints)和有什么区别RouteCollection.IgnoreRoute(url, constraints)

背景

新的 MVC 项目IgnoreRoute在 Global.asaxRegisterRoutes方法中包含此调用,以跳过路由到 .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 模式上应用路由的约束。

4

1 回答 1

20

CodePlex 上的源代码System.Web.Mvc.RouteCollectionExtensions和在我的本地 GAC 上运行一点ILSpy 之间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;
    }
}
于 2012-07-18T14:58:55.603 回答