首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RouteCollection.Ignore和RouteCollection.IgnoreRoute的区别是什么?

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

Stack Overflow用户
提问于 2012-07-18 22:58:56
回答 1查看 4.4K关注 0票数 18

RouteCollection.Ignore(url, constraints)RouteCollection.IgnoreRoute(url, constraints)有什么不同

背景

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

代码语言:javascript
复制
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

我想向项目中添加一个额外的忽略路由,于是我开始键入新行。在routes.I之后,智能感知与.Ignore.IgnoreRoute一起弹出,两者听起来大致相同。

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

  • RouteCollection.Ignore:“定义了一种URL模式,如果请求URL满足指定的约束条件,则不应检查该模式是否与路由匹配”(MSDN docs).
  • RouteCollection.IgnoreRoute:“忽略给定可用路由列表和约束列表的指定URL路由”(MSDN docs).

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

EN

回答 1

Stack Overflow用户

发布于 2012-07-18 22:58:56

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

RouteCollection.IgnoreRoute (通过CodePlex source)

代码语言:javascript
复制
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反编译)

代码语言:javascript
复制
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类本身中的实例方法,另一个是该类的扩展方法。在考虑到来自实例和扩展执行的代码差异之后(比如扩展实例上的关键null检查),它们看起来是一样的。

它们的核心都使用完全相同的StopRoutingHandler类。这两个类都有自己的密封IgnoreRouteInternal类版本,但这些版本的代码是相同的。

代码语言:javascript
复制
private sealed class IgnoreRouteInternal : Route {
    public IgnoreRouteInternal(string url)
        : base(url, new StopRoutingHandler()) {
    }
    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary routeValues) {
        return null;
    }
}
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11544338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档