Attenzione al %20 nelle url

Giorni fa ho avuto a che fare con un piccolo problema riguardante le url di una mia applicazione web. In pratica mi trovavo con delle richieste verso un indirizzo tipo il seguente “/mycontroller/myaction/myid%20” (per chi non lo sapesse %20 equivale allo spazio) che, non per volere mio, restituiva sempre un 404 invece di dirottare la chiamata verso il mio controller.

Come si può ben immaginare il problema è dovuto a quel %20 che, per qualche strano motivo, non viene digerito dal sistema di routing di ASP.NET 3.5 SP1.

Ovviamente un url del genere può sembrare raro in un’applicazione web, e molti di voi si chiederanno il perché di tale indirizzo, quindi provo a spiegarlo di seguito Smile.

La settimana scorsa mi trovavo a sviluppare un textbox autocomplete con jquery per un’applicazione ASP.NET MVC; sfortunatamente le features richieste non erano coperte dalle migliaia di esempi presenti in rete, quindi mi sono dovuto armare di coraggio e, a colpi di javascript e json, sono riuscito a realizzare la textbox che trovate qui.

All’apparenza il funzionamento è identico a quello di tutte le textbox con autocomplete. Per capire il problema sopra mostrato, non è necessario addentrarsi nel codice javascript o nel modo in cui ho implementato la textbox, ma basta capire cosa fa per mostrare i suggerimenti all’utente.

Nel momento in cui l’utente digita qualcosa, questo qualcosa viene inviato ad una Action di un controller MVC che non fa altro che eseguire una query con un like e restituire i primi 7 elementi. Questo vuol dire che ogni volta in cui l’utente digita una lettera all’interno della textbox, via javascript viene inviato il testo digitato per eseguire l’operazione sopra descritta.
Passando alla pratica, quando l’utente digita “Mario”, una chiamata tipo la seguente “/Search/PersonSuggestion/Mario” viene effettuata.

Supponiamo ora di voler raffinare la ricerca in quanto troppe persone si chiamano Mario, e noi vogliamo trovare il classicissimo Mario Rossi.

Nel momento in cui l’utente deve aggiungere “ Rossi” (spazio Rossi), la chiamata diventa più o meno così:

/Search/PersonSuggestion/Mario%20Rossi

Ovviamente prima di arrivare a digitare Rossi c’è uno spazio, quindi verrà effettuata una chiamata come questa: “/Search/PersonSuggestion/Mario%20

Ed eccoci arrivati al problema iniziale: il 404 da parte del server.

Il motivo risiede nel fatto che il runtime di ASP.NET effettua una validazione delle url in entrata, applicando le stesse regole del filesystem. Questo vuol dire che, così come non possiamo creare una folder con lo spazio alla fine (quindi “Mario “), non possiamo neanche avere un url con lo stesso spazio.

Ovviamente questo tipo di validazione è “aggirabile” grazie ad una proprietà dal curioso nome “RelaxedUrlToFileSystemMapping”, da aggiungere alla sezione HttpRuntime del web.config come mostrato di seguito.

<system.web>
    <httpRuntime 
            requestValidationMode="2.0" 
            executionTimeout="20" 
            requestPathInvalidCharacters="" 
            relaxedUrlToFileSystemMapping="true" />

Ciauz


Comments