RouteCollection.Ignore和RouteCollection.IgnoreRoute之间的区别是什么?

18

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

背景

在Global.asax的RegisterRoutes方法中,新的MVC项目包括这个IgnoreRoute调用,以便跳过对由ASP.NET系统其他部分处理的.axd位置的请求进行路由。

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

我想给项目添加一个额外的被忽略的路由,然后我开始输入新的行。在routes.I之后,智能感知弹出了.Ignore.IgnoreRoute,这两个听起来差不多。

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

  • RouteCollection.Ignore:"定义一个 URL 模式,在满足指定约束的情况下,不应检查该模式与路由的匹配情况" (MSDN 文档)。
  • RouteCollection.IgnoreRoute:"忽略给定可用路由列表和约束列表的指定 URL 路由" (MSDN 文档)。

两者都需要提供路由 URL 模式和一组约束条件,以限制该路由模式的应用。

1个回答

20

通过在 CodePlex 上查看 System.Web.Mvc.RouteCollectionExtensions.cs 的源代码 和在本地 GAC 上运行一些 ILSpy,我发现它们似乎没有区别,虽然它们似乎有完全独立的代码来执行相同的操作。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接