asp.net-mvc - mvc routing examples
Diferencia entre RouteCollection.Ignore y RouteCollection.IgnoreRoute? (1)
¿Cuál es la diferencia entre RouteCollection.Ignore(url, constraints)
y RouteCollection.IgnoreRoute(url, constraints)
?
Fondo
Los nuevos proyectos MVC incluyen esta llamada IgnoreRoute
en el método Global.asax RegisterRoutes
para omitir el enrutamiento de solicitudes a ubicaciones .axd que se manejan en otro lugar del sistema ASP.NET.
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
Quería agregar una ruta adicional ignorada a un proyecto y comencé a escribir la nueva línea. Después de routes.I
, Intellisense aparece con .Ignore
y .IgnoreRoute
, ambos sonando casi igual.
Según los documentos de MSDN, puede ver que uno es un método de instancia de la clase System.Web.Routing.RouteCollection
y el otro es un método de extensión en esa clase de System.Web.Mvc.RouteCollectionExtensions
.
-
RouteCollection.Ignore
: "Define un patrón de URL que no debe verificarse para que coincida con las rutas si una URL de solicitud cumple con las restricciones especificadas" ( documentos MSDN ). -
RouteCollection.IgnoreRoute
: "Ignora la ruta URL especificada para la lista dada de las rutas disponibles y una lista de restricciones" ( documentos de MSDN ).
Ambos toman un patrón de URL de ruta y un conjunto de restricciones que restringen la aplicación de la ruta en ese patrón de URL.
Entre la fuente para System.Web.Mvc.RouteCollectionExtensions
en CodePlex y ejecutar un poco de ILSpy en mi GAC local para System.Web.Routing.RouteCollection
, no parece que haya una diferencia, aunque parece que tienen un código completamente independiente para hacer la misma cosa.
RouteCollection.IgnoreRoute
(a través de la fuente CodePlex )
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
(a través de descompilar 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);
}
Diferencias
La única diferencia real es la diferencia obvia en la ubicación, uno es un método de instancia en la RouteCollection
clase RouteCollection
y uno es un método de extensiones en esa clase. Después de tener en cuenta las diferencias de código que vienen de la ejecución de la instancia frente a la extensión (como la comprobación nula vital en la instancia extendida), aparecen idénticas.
En su núcleo, ambos usan exactamente la misma clase StopRoutingHandler
. Ambos tienen sus propias versiones de una clase IgnoreRouteInternal
sellada, pero esas versiones son idénticas en código.
private sealed class IgnoreRouteInternal : Route {
public IgnoreRouteInternal(string url)
: base(url, new StopRoutingHandler()) {
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary routeValues) {
return null;
}
}