2010-07-08 15 views
16

tomar las siguientes medidas controlador¿Por qué un arrastre% 20 (datos válidos en este caso) matar a asp.net mvc enrutamiento

public ActionResult NextBySURNAME(int id, string data) 
    { 
     //code to process the data and edit the id accoringly not written yet 
     return RedirectToAction("Edit", new { id = id }); 
    } 

si llamo con /myController/NextBySURNAME/12/Smith% 20Simon

entonces funciona bien (en este caso la edición récord 12) pero

/myController/NextBySURNAME/12/20% Smith

me da un 404

Ahora sé que en algunos casos en mi problema el espacio en blanco al final es significativo, así que no solo quiero recortarlo. Entonces, ¿por qué esto está rompiendo mi ruta?

 routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}/{data}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional, data=UrlParameter.Optional } // Parameter defaults 
     ); 
+0

Robert: Sé que el * código * pasa a ser C#, pero el problema de los últimos% que rompen el enrutamiento es (probablemente) no específico del idioma. Prefiero no etiquetar este C# – Andiih

+2

Wow, acabo de probarlo, eso es interesante ... – Aren

+1

@Andiih & Robert: '.net' probablemente sería una etiqueta más descriptiva que' C# ', sin embargo encontré esta pregunta porque estaba buscando 'C#' – Aren

Respuesta

8

Así que hice algunas depuración de ruta y descubrí que las rutas que terminan en un espacio ni siquiera estaban siendo evaluadas por mi aplicación MVC. Por lo tanto, IIS debe manejar estas solicitudes de manera deficiente.

Agregué una regla de reescritura a IIS 7.5 para hacer coincidir los espacios finales y volver a escribirlos como la misma url sin el espacio. No estoy satisfecho con esta solución, pero no he podido encontrar una explicación sobre por qué IIS manipula incorrectamente las URL con espacios finales.

+1

Parece que alguien tiene que agregar, esencialmente , un 'Trim()' en algún lugar dentro de IIS. :) – JYelton

+0

@JYelton & BC, ¿qué pasa si quieres buscar algo como: '" Hola "' Si ocurre el ajuste, se romperá. El enrutamiento debería funcionar como se espera y producir una cadena (en caso de OP) de '" Smith "' para que él la maneje más tarde. – Aren

+0

Estoy de acuerdo. ¿Cómo haces que IIS juegue bien? –

1

Creo que el modo en que se manejan los caracteres escapados es modificable en .NEt 4.0, pero yo no lo he probado. Ver http://msdn.microsoft.com/en-us/library/system.uri.aspx.

Andrews respuesta a URL-encoded slash in URL

también How to create a Uri instance parsed with GenericUriParserOptions.DontCompressPath

Todo esto es solamente salvaje adivinar pero tal ayuda.

+0

Gracias MF. Aquí hay información útil, voy a experimentar con las técnicas, pero vale la pena señalar que su ÚNICO% 20 que lo rompe, otros personajes escapados no tienen el mismo efecto. – Andiih

Cuestiones relacionadas