2010-11-30 16 views
12

La razón por la que pregunto es porque IIS protege ciertas carpetas ASP.NET, como Bin, App_Data, App_Code, etc. Incluso si la URL no se asigna a una carpeta real del sistema de archivos, IIS rechaza una URL con un segmento de ruta igual a uno de los nombres mencionados.Enrutamiento ASP.NET: subsegmento literal entre tokens y valores de ruta con un carácter del subsegmento literal

Esto significa que no puedo tener una ruta como esta:

{controller}/{action}/{id} 

... donde id puede ser cualquier cadena, por ejemplo,

Catalog/Product/Bin 

Así, en lugar de desactivar esta medida de seguridad que estoy dispuesto a cambiar la ruta, usando un sufijo antes de la identificación, como los siguientes:

{controller}/{action}_{id} // e.g. Catalog/Product_Bin 
{controller}/{action}/_{id} // e.g. Catalog/Product/_Bin 

Pero estas rutas no va a funcionar si el id contiene el nuevo delímetro, _ en este caso, por ejemplo

// These URL won't work (I get 404 response) 
Catalog/Product_Bin_ 
Catalog/Product/_Bin_ 
Catalog/Product/__Bin 

¿Por qué? No lo sé, parece un error para mí. ¿Cómo puedo hacer que estas rutas funcionen, donde id puede ser cualquier cadena?

+0

¿Es esto algo que podría lograr con [UrlRewrite] (http://www.iis.net/download/URLRewrite)? – R0MANARMY

+0

Curiosamente, Catalog/Product/_bin_ funcionó para mí, pero Catalog/Product/__ Bin no funcionó. Estoy consultando con el desarrollador para averiguar por qué ese es el caso. Yo pensaría que debería funcionar también. – Haacked

+0

¿Es posible que esto ocurre así cuando se hace algo así como **/0} {id ** tengo este problema en este momento y lo que parece ser 404 con algunos ID, pero no para otros ... –

Respuesta

7

Ok, tengo una respuesta definitiva. Sí, esto es un error. Sin embargo, en este punto lamento decir que no tienen planes para solucionarlo por un par de razones:

  • es un cambio de última hora y podría ser una muy difícil darse cuenta o ne en eso.
  • Hay una solución fácil.

Lo que puede hacer es cambiar la URL de no tener el carácter de subrayado:

{controller}/{action}/_{id} 

Luego agregar una restricción ruta que requiere que el parámetro ID comienza con un carácter de subrayado.

Luego, dentro de su método de acción, corta el prefijo de subrayado del parámetro id. Incluso podría escribir un filtro de acción para hacer esto por usted si quisiera. Lo siento por los inconvenientes ocasionados.

+0

Me encontré con este error también, al parecer. La ruta no coincidiría solo cuando el * primer * carácter de mi id era el mismo que el prefijo literal. http://stackoverflow.com/questions/8711829/why-wont-this-route-match –

0

Puede utilizar caracteres que no están permitidos para un nombre de archivo o directorio como: *,?,:., ", <,>, |

0

con ASP.NET MVC si nos fijamos en la fuente que tener un valor codificado para el separador de ruta (/) y que yo sepa no se puede cambiar.

Cuestiones relacionadas