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模式上的应用。
答案 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;
}
}