2010-01-18 14 views
16

Tengo una aplicación MVC.NET con una ruta de la siguiente manera:¿Cómo se permiten "caracteres ilegales en la ruta"?

routes.MapRoute("member", "member/{id}/{*name}", new { controller = "member", action = "Details", id = "" }, new { id = @"\d+" });

Por lo tanto, un enlace podría ser algo como esto: http://domain/member/123/any_kind_of_username

Esto funciona bien en general, pero si la ruta contiene ilegal caracteres (por ejemplo, un qoute doble: http://domain/member/123/my_ "user" _name) Obtengo una "System.ArgumentException: caracteres ilegales en la ruta".

Después de mucho Google las mejores sugerencias parecen ser para asegurarse de que la url no contenga tales caracteres. Desafortunadamente, eso está fuera de mi control en este caso.

¿Hay alguna forma de evitar esto?

+2

presumiblemente se llaman caracteres ilegales porque no puede usarlos ... –

+0

¿No pueden estos ser URL codificados? – Oded

+1

@Mitch - Bueno, una comilla doble, por ejemplo, funciona bien para Apache, así que no puedo ver por qué IIS no lo permitiría. @Oded - El problema es que no tengo el control de estas URL. – hbruce

Respuesta

1

Debe codificar con URL la URL en el extremo del cliente antes de enviarla. Intente utilizar el método UrlHelper.Encode.

+0

Lo siento, lo mismo aquí que con las otras sugerencias hasta el momento. Me temo que no tengo el control de las URL al final del cliente. – hbruce

+3

Lo estoy recibiendo incluso cuando el URI codificado se envía desde el cliente – IsmailS

4

Resulta que puede evitar esto estableciendo allowDoubleEscaping = "false" en requestFiltering en web.Config. es decir:

<configuration> 
    <system.webServer> 
    <security> 
     <requestFiltering allowDoubleEscaping="false" /> 
    </security> 
    </system.webServer> 
</configuration> 

Tal vez no sea la solución perfecta (alguna sugerencia para una mejor se aprecia mucho), pero se soluciona el problema.

+0

@hbruce: Es la mejor solución que he encontrado hasta ahora, ¡gracias! – PanJanek

+1

efecto secundario bastante serio: ya no puede usar caracteres como '+' en las URL si habilita esta configuración. ver: http://stackoverflow.com/questions/1453218/is-enabling-double-escaping-dangerous –

0

¿Qué tal un ampersand (&) en la url? Por ejemplo: mysite.com/JellyBeans/PB & J, donde "PB & J" es un valor de parámetro en un método de acción de controlador. ¿Cómo se puede evitar que MVC y el motor ASP.NET traten eso como un char ilegal en la cadena url base? Codificar eso con un% 26 no parece funcionar. Curiosamente, al iniciar VS depurar el servidor web local (VS integrado en el servidor web) maneja bien ese caso (como un & y un% 26), pero cuando se implementa en un servidor web que ejecuta IIS7 la URL genera una "Solicitud incorrecta" ".

+2

El servidor web incorporado VS.NET es bastante defectuoso y no cumple con los estándares. Si se encuentra con un comportamiento extraño, es mejor que lo ignore y simplemente use IIS. –

7

de Scott Hanselman publicado un buen resumen sobre allowing illegal characters in the path.

Si realmente quiere permitir caracteres que están restringidos, eliminarlos de la lista mediante la edición de su web.config (esto probablemente sólo funcionan en .NET 4 y en IIS7):

<system.web> 
    <httpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters="&lt;,&gt;,*,%,:,&amp;,\" /> 
</system.web> 

también puede ser necesario para hacer lo que hbruce suggests:

<system.webServer> 
    <security> 
     <requestFiltering allowDoubleEscaping="true"/> 
    </security> 
</system.webServer> 

todavía hay algunos ciertos caminos th at will not work, (como/search /%) ya que recibirá el mensaje 400 "Solicitud incorrecta - URL no válida". La única solución que he encontrado es usar esa parte como una cadena de consulta:/search? Q =% con los pasos anteriores.

+0

¿Existe una alternativa para .net 2? – lathomas64

Cuestiones relacionadas