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/