RouteCollection.Ignore和RouteCollection.IgnoreRoute之间的区别?

时间:2012-07-18 14:58:56

标签: asp.net-mvc asp.net-mvc-routing ignoreroute

RouteCollection.Ignore(url, constraints)RouteCollection.IgnoreRoute(url, constraints)之间的区别是什么?

背景

新的MVC项目在Global.asax IgnoreRoute方法中包含此RegisterRoutes调用,以跳过对在ASP.NET系统中其他位置处理的.axd位置的请求的路由。

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

我想为项目添加一个额外的忽略路径,然后我开始输入新行。在routes.I之后,Intellisense弹出.Ignore.IgnoreRoute,两者听起来都差不多。

根据MSDN文档,您可以看到一个是System.Web.Routing.RouteCollection类的实例方法,另一个是来自System.Web.Mvc.RouteCollectionExtensions的该类的扩展方法。

  • RouteCollection.Ignore:"定义一个URL模式,如果请求URL满足指定的约束条件,则不应检查路由匹配路由#34; (MSDN docs)。
  • RouteCollection.IgnoreRoute:"忽略给定可用路由列表的指定URL路由和约束列表" (MSDN docs)。

两者都采用路由URL模式和一组约束来限制路由在该URL模式上的应用。

1 个答案:

答案 0 :(得分:18)

在我System.Web.Routing.RouteCollection的本地GAC上source for System.Web.Mvc.RouteCollectionExtensions on CodePlex和运行一点ILSpy之间,看起来没有区别,尽管它们似乎有完全独立的代码要做同样的事情。

RouteCollection.IgnoreRoute(通过CodePlex source

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;
    }
}