2012-04-20 13 views
7

Ich versuche, einige Legacy-URLs zu unterstützen und sie Controller-Aktionen zuzuordnen. Die URLs wie folgt aussehen:MVC Routen mit Sonderzeichen

/~Home+Office~Note+Pads.html 

Hier ist meine Route:

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

Hier ist die (Anfänge) mein Controller mit ihnen umgehen:

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

Wenn ich einen Haltepunkt setzen in LegacyCIController, und ich setze meine Startseite auf XXX.html, der Haltepunkt trifft (und schlägt die if) und das Leben ist gut. Aber wenn ich versuche, die Startseite auf ~Address+Labels.html zu setzen, wird kein Haltepunkt erreicht, und Chrome kotzt nur und zeigt mir eine Seite, auf der steht "oops, diese Seite scheint kaputt zu sein".

Ich führe diese Seite durch IIS 7 auf meinem Computer, nicht Visual Studio.

Ist diese URL so fehlerhaft, dass eine normale MVC-Route nicht einmal damit umgehen kann, oder mache ich etwas anderes falsch?

+6

Wow, das ist ein ziemlich aufgebockter Dateiname. – Tejs

+0

@Tejs - ja, ja ist es. Der Umgang mit Legacy-Zeug ist eine der wahren Freuden des Lebens :) –

+0

Meine Theorie ist, dass IIS die Anfrage springt - ich denke, IIS7 hat eine Blacklist URL-Zeichensatz. – Tejs

Antwort

5

standardmäßig IIS7 Blöcke URLs (Fehler 404.11) mit einer + auf dem Weg, können Sie dies außer Kraft setzen, indem Sie auf allowDoubleEscaping in web.config drehen:

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

Doch wie erklärt wird das IIS-Blog diese Option, um eine potenzielle Sicherheitslücke öffnet, so dass ein wenig vorsichtig sein, während es mit:

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

+0

Nochmals vielen Dank. Das hat perfekt funktioniert. –

0

Versuchen Sie mit HandleUnknownAction. In Ihrem Controller:

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