RouteCollection.Ignore(url, constraints)和RouteCollection.IgnoreRoute(url, constraints)有什么不同
背景
新的MVC项目在Global.asax RegisterRoutes方法中包含此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模式,如果请求URL满足指定的约束条件,则不应检查该模式是否与路由匹配”(MSDN docs).RouteCollection.IgnoreRoute:“忽略给定可用路由列表和约束列表的指定URL路由”(MSDN docs).两者都采用一个路由URL模式和一组限制在该URL模式上应用路由的约束。
发布于 2012-07-18 22:58:56
在source for System.Web.Mvc.RouteCollectionExtensions on CodePlex和在我本地的GAC上为System.Web.Routing.RouteCollection运行一个小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;
}
}https://stackoverflow.com/questions/11544338
复制相似问题