2012-04-20 18 views
7

Sto provando a supportare alcuni URL legacy e li associo alle azioni del controller. Gli URL simile a questa:Percorsi MVC con caratteri speciali

/~Home+Office~Note+Pads.html 

Ecco il mio percorso:

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

Ecco il (inizi) il mio controller trattare con loro:

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

Se ho impostato un punto di interruzione LegacyCIController, e ho impostato la mia pagina iniziale su XXX.html, il punto di interruzione colpisce (e non riesce il if) e la vita è buona. Ma quando provo a impostare la pagina iniziale su ~Address+Labels.html, nessun punto di interruzione viene colpito, e Chrome mi vomita e mi mostra una pagina che dice "oops, questa pagina sembra essere rotta".

Sto eseguendo questa pagina tramite IIS 7 sul mio computer, non in Visual Studio.

Questo URL è così malformato che una normale rotta MVC non può nemmeno gestirlo, o sto facendo qualcos'altro di sbagliato?

+6

Wow, questo è un bel nome di file. – Tejs

+0

@Tejs - sì, sì lo è. Trattare con materiale legacy è una delle vere gioie della vita :) –

+0

La mia teoria è che IIS sta rimbalzando la richiesta - Penso che IIS7 abbia un set di caratteri URL nella lista nera. – Tejs

risposta

5

da blocchi di default IIS7 URL (errore 404,11) con un + nel percorso, è possibile ignorare questo accendendo allowDoubleEscaping in web.config:

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

Tuttavia, come spiegato a il blog di IIS questa opzione si apre un potenziale buco di sicurezza, in modo da essere un po 'attenti durante l'utilizzo:

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

+0

Grazie ancora. Ha funzionato perfettamente. –

0

Provare a utilizzare HandleUnknownAction. Nel vostro controller:

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