2011-08-22 10 views
7

El valor predeterminado ASP.NET MVC 3 plantilla de proyecto contiene la Directiva IgnoreRoute siguiente:¿Cuál es la diferencia entre estas dos directivas ASP.NET MVC IgnoreRoute?

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

Ahora he visto varios proyectos cambian ésta (incluyendo StackExchange's DataExplorer) texto en su lugar que se parece a:

routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"}); 

¿Alguien podría explicar en qué escenario o en general por qué la ruta por defecto .axd ignorando no sería adecuada mientras que esta última versión sería? O viceversa, ¿por qué podría uno elegir no usar esta última versión y, en su lugar, quedarse con la predeterminada?

Debo admitir que no entiendo completamente la sintaxis IgnoreRoute, y el MSDN documentation on the subject es bastante escueto.

+0

En caso de que alguien le sucede a venir a través de esto en el futuro, MS tiene alguna documentación decente sobre el enrutamiento de ASP.NET disponible [aquí] (http://msdn.microsoft.com/en-us/library/cc668201 (v = VS.100) .aspx). Consulte específicamente la sección ** Patrones de URL **, que se aplica a funciones como MapRoute, IgnoreRoute, etc. –

Respuesta

6

Hay una explicación en el blog de Phil Haack: Make Routing Ignore Requests For A File Extension

La idea básica, citando a Phil, es decir:

Una solución a esto es agregar una adecuada ignoran ruta para indicar que el enrutamiento debe ignorar estos peticiones. Desafortunadamente, no podemos hacer algo como esto:

{*path}.aspx/{*pathinfo} 

solo se permite un cajón de sastre de ruta y así debe suceder al final de la URL. Sin embargo, puede tomar el siguiente enfoque ...

Lo que estoy haciendo aquí es una técnica que Eilon me mostró que es asignar todas las direcciones URL a estas rutas, pero luego restringe las rutas a ignorar a través del diccionario de restricciones. Entonces, en este caso, estas rutas coincidirán (y por lo tanto ignorarán) todas las solicitudes de favicon.ico (sin importar en qué directorio) así como las solicitudes de un archivo .aspx. Como le indicamos al enrutamiento que ignore estas solicitudes, se producirá el procesamiento ASP.NET normal de estas solicitudes.

3

La diferencia entre los dos IgnoreRoute llamadas desde el post original es el siguiente:

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

Esto coincidirá con las peticiones de recursos como /ScriptManager.axd o /Foo.axd/bar/ baz.aspx, pero se no coincidir una solicitud a cualquier * .axd recursos por debajo de la raíz de su sitio, como /foo/bar/Baz.axd.

routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"}); 

Esta llamada utiliza una expresión regular para que coincida con una solicitud a cualquier * .axd recursos , en cualquier nivel de su sitio, como /foo/bar/Baz.axd. Por lo tanto, esta llamada sería preferible a la primera si hace referencia a cualquier recurso axd debajo de la raíz de su sitio.

Si usted analiza la expresión regular, el .* al comienzo coincidirá con 0 o más de cualquier carácter. \.axd coincidirá con la cadena literal ".axd", y (/.*)? coincidirá opcionalmente con una barra seguida de 0 o más caracteres.

El * en el patrón {*allaxd} URL garantiza que se explorará toda la ruta, y no solo una sección de la ruta. allaxd es simplemente una etiqueta arbtrary dada a la parte coincidente de la ruta, que en este caso será la ruta completa. Este método de ignorar rutas efectivamente le permite ignorar rutas para extensiones de archivos específicas. Puede copiar fácilmente esta llamada y hacer algunos cambios para ignorar las rutas para * .aspx, * .asmx, etc.

Para obtener documentación detallada sobre el enrutamiento, le recomiendo the following MSDN page.

Cuestiones relacionadas