Qué es route.IgnoreRoute (“{resource} .axd / {* pathInfo}”)

Respuestas:

81

Los archivos .axd no existen físicamente. ASP.NET usa URL con extensiones .axd (ScriptResource.axd y WebResource.axd) internamente, y son manejadas por un HttpHandler.

Por lo tanto, debe mantener esta regla para evitar que ASP.NET MVC intente manejar la solicitud en lugar de dejar que el HttpHandler dedicado lo haga.

Roy Dictus
fuente
5
Estoy bastante seguro de que querrás que la gente pueda descargar los "archivos axd" en tu sitio, ya que contienen javascript y estilos.
Moulde
3
Esta respuesta es incorrecta. La razón para poner IgnoreRouteen la configuración de enrutamiento de MVC es asegurarse de que MVC no intente manejar la solicitud. Esto se debe a que los .axdpuntos finales deben ser manejados por otro controlador HTTP (un controlador que no es parte de MVC) para poder entregar scripts.
NightOwl888
1
¿Es esto completamente innecesario en .NET core? He buscado en Google durante aproximadamente una hora y no puedo encontrar ninguna referencia sobre cuáles serían los pasos equivalentes, por lo que supongo que simplemente no es necesario.
Dinerdo
35

Algunos antecedentes

Si abre este archivo:

%WINDIR%\Microsoft.NET\Framework\version\Config\Web.config

encontrará esto dentro del archivo:

<add path="WebResource.axd"
     verb="GET"
     type="System.Web.Handlers.AssemblyResourceLoader"
     validate="True" />

Eso es básicamente decirle al tiempo de ejecución de Asp.NET: "Oye, amigo de asp.net, si llega una solicitud para WebResource.axd, usa AssemblyResourceLoader para procesar la solicitud".

Tenga en cuenta que WebResource.axd NO es un archivo, sino simplemente un mapa (si se me permite decirlo) AssemblyResourceLoader. Es el nombre con el que está registrado el controlador. En mi máquina, encontré los siguientes controladores .axd:

<add path="eurl.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
<add path="trace.axd" verb="*" type="System.Web.Handlers.TraceHandler" validate="True" />
<add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True" />
<add verb="*" path="*_AppService.axd" 

Ok, entonces, ¿qué hace ese controlador?

El AssemblyResourceLoadersabe cómo buscar archivos incrustados dentro de un ensamblaje para que pueda servirlo (enviarlo al cliente, es decir, un navegador). Por ejemplo, en los formularios web de asp.net, si usa los controles de validación, estos dependen de algún javascript para mostrar los errores en la página web. Sin embargo, ese javascript está incrustado en un ensamblado. El navegador necesita javascript, por lo que verá esto en el html de la página:

<script src="/YourSite/WebResource.axd?d=fs7zUa...&amp;t=6342..." type="text/javascript"></script>

El AssemblyResourceLoaderse encuentra el montaje en el que el Javascript está incrustado utilizando la información de la cadena de consulta y devolver el javascript.


De vuelta a la pregunta

Entonces, para responder a la pregunta, ¿qué es:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

Eso le dice al motor de enrutamiento que no procesaremos aquellas solicitudes que coincidan con ese patrón de ruta. En otras palabras, no procesaremos .axdsolicitudes. ¿Por qué? Debido a sí MVC es un HttpHandler similar a .axdy .aspxy muchos otros controladores que se encuentran en el archivo web.config. El controlador MVC no sabe cómo procesar la solicitud, como buscar recursos integrados en un ensamblado, AssemblyResourceLoadersabe cómo hacerlo. MVC sabe cómo hacer, bueno, todo lo que hace está más allá del alcance de esta pregunta y respuesta.

CodificaciónYoshi
fuente
2
Esta definitivamente debería ser la respuesta aceptada, más una mía.
Yahya
Finalmente, una explicación clara de lo que realmente hace WebResource.axd al mismo tiempo que proporciona una respuesta clara a la pregunta. Gracias
ben_mj
18

La ruta con el patrón {resource} .axd / {* pathInfo} se incluye para evitar que las solicitudes de archivos de recursos web como WebResource.axd o ScriptResource.axd se pasen a un controlador.

Leer enlace: http://msdn.microsoft.com/en-us/library/cc668201%28v=vs.100%29.aspx

También puede especificar que el enrutamiento no debe manejar ciertas solicitudes de URL. Evita que el enrutamiento maneje ciertas solicitudes definiendo una ruta y especificando que la clase StopRoutingHandler debe usarse para manejar ese patrón. Cuando una solicitud es manejada por un objeto StopRoutingHandler , el objeto StopRoutingHandler bloquea cualquier procesamiento adicional de la solicitud como una ruta. En su lugar, la solicitud se procesa como una página ASP.NET, servicio web u otro punto final ASP.NET. Puede usar el método RouteCollection.Ignore (o RouteCollectionExtensions.IgnoreRoute para aplicaciones MVC) para crear rutas que usen la clase StopRoutingHandler .

Kumar Manish
fuente
7

Esos no son archivos (no existen en el disco), son solo nombres con los que se registran algunos controladores HTTP.

Kumar Manish
fuente
la respuesta más relevante, diría yo.
Sakthivel