2012-04-20 15 views
7

Estoy intentando admitir algunas URL antiguas y asignarlas a las acciones del controlador. Las direcciones URL de aspecto:Rutas MVC con caracteres especiales

/~Home+Office~Note+Pads.html 

Aquí es mi ruta:

routes.MapRoute(
    "LegacyCategory", 
    "{path}.html", 
    new { controller = "LegacyCI", action = "Index", } 
); 

aquí está el (inicios de) mi controlador de tratar con ellos:

public class LegacyCIController : Controller { 
    public ActionResult Index(string path) { 
     if (path == "~Address+Labels") { 
      return RedirectToAction("Display", "Category", new { id = "AddressLabels" }); 
     }  
     return RedirectToAction("Index", "Category"); 
    } 
} 

Si fijo un punto de interrupción en LegacyCIController, y configuro mi página de inicio en XXX.html, el punto de interrupción impacta (y falla el if) y la vida es buena. Pero cuando intento configurar la página de inicio en ~Address+Labels.html, no se llega a ningún punto de interrupción, y Chrome simplemente vomita y me muestra una página que dice "Vaya, esta página parece estar rota".

Estoy ejecutando esta página a través de IIS 7 en mi máquina, no en Visual Studio.

¿Esta URL está tan mal formada que una ruta regular de MVC ni siquiera puede manejarla, o estoy haciendo algo diferente?

+6

Wow, ese es un nombre de archivo bastante jacked. – Tejs

+0

@Tejs - sí, sí lo es. Tratar con material heredado es una de las verdaderas alegrías de la vida :) –

+0

Mi teoría es que IIS está rebotando en la solicitud, creo que IIS7 tiene un conjunto de caracteres de URL en la lista negra. – Tejs

Respuesta

5

por bloques de IIS7 predeterminado URL (error 404.11) con una + en el camino, puede anular esta activando allowDoubleEscaping en web.config:

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

Sin embargo, como se explica en el blog de IIS esta opción se abre un agujero de seguridad potencial, así que un poco de cuidado al usarlo:

http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx

+0

Gracias de nuevo. Eso funcionó perfectamente. –

0

Intente utilizar HandleUnknownAction. En su controlador:

protected override void HandleUnknownAction(string actionName) { 
    if(Request.Path == "/~Address+Labels.html") { 
    RedirectToAction("Display", "Category").ExecuteResult(ControllerContext); 
    } else { 
    base.HandleUnknownAction(actionName); 
    } 
}