mvc examples asp.net-mvc asp.net-mvc-routing ignoreroute

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; } }