asp.net-mvc - RouteCollection.Ignore和RouteCollection.IgnoreRoute之间的区别?

标签 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满足指定的约束,则不应检查该模式是否与路由匹配”(MSDN docs)。
RouteCollection.IgnoreRoute:“忽略给定的可用路由列表和约束列表的指定URL路由”(MSDN docs)。

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

最佳答案

source for System.Web.Mvc.RouteCollectionExtensions on CodePlex和在System.Web.Routing.RouteCollection的本地GAC上运行一些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类本身的实例方法,另一个是该类上的扩展方法。在考虑了实例与扩展执行之间的代码差异(例如,扩展实例上的重要null检查)之后,它们看起来是相同的。

它们的核心都使用完全相同的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;
    }
}

关于asp.net-mvc - RouteCollection.Ignore和RouteCollection.IgnoreRoute之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11544338/

相关文章:

asp.net - asp.net MVC 3 Dropdownlist中的多重选择

asp.net-mvc - 将 Html.ActionLink 与 RouteValues 一起使用

asp.net-mvc - 搜索页面MVC路由(隐藏操作,没有斜线,像SO)

c# - 如何忽略 asp.net 中的路由表单 url 路由

ruby-on-rails - 是否有等效于 redirect_to :back in ASP. NET MVC

javascript - 在 IE/Firefox 中获取用户磁盘上上传文件的文件路径

asp.net-mvc - 用于搜索的 ASP.NET MVC 自定义路由

asp.net-mvc - 如何阻止来自 IIS7 中托管的 ASP.NET MVC 1.0 应用程序内部的所有 *.php、*.cgi 等页面的请求?

c# - 在 EF6 中将匿名类型转换为 IEnumerable<>