2012-04-20 13 views
7

Próbuję obsługiwać starsze adresy URL i mapować je do działań kontrolerów. Adresy URL wyglądać tak:Trasy MVC ze znakami specjalnymi

/~Home+Office~Note+Pads.html 

Oto moja droga:

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

Oto (początki) mój sterownik do radzenia sobie z nimi:

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

Jeżeli ustawić punkt przerwania w LegacyCIController, a ja ustawiłem stronę początkową na XXX.html, trafienia punktu przerwania (i nieudane if) i życie jest dobre. Ale kiedy próbuję ustawić stronę startową na ~Address+Labels.html, nie ma żadnego punktu przerwania, a Chrome po prostu wymiata i pokazuje mi stronę z napisem "Ups, ta strona wygląda na uszkodzoną".

Używam tej strony przez IIS 7 na moim komputerze, a nie Visual Studio.

Czy ten adres URL jest tak źle sformułowany, że zwykła trasa MVC nie może go obsłużyć lub czy robię coś innego?

+6

Wow, to całkiem niezła nazwa pliku. – Tejs

+0

@Tejs - tak, tak jest. Radzenie sobie ze starszymi rzeczami jest jedną z prawdziwych radości życia :) –

+0

Moja teoria jest taka, że ​​IIS odrzuca żądanie - myślę, że IIS7 ma zestaw znaków na czarnej liście URL. – Tejs

Odpowiedz

5

blokami domyślny IIS7 URL (błąd 404,11) z + w ścieżce można zmienić poprzez włączanie allowDoubleEscaping w web.config:

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

Jednakże, jak wyjaśniono na blog IIS opcja ta otwiera potencjalną lukę w zabezpieczeniach, więc być trochę ostrożnym podczas korzystania z niego:

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

+0

Jeszcze raz dziękuję. To działało idealnie. –

0

Spróbuj użyć HandleUnknownAction. W kontrolerze:

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