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
.
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
- There is no TrackBack for this post.
#1 da Tiziano Wednesday November 2011 alle 12:00
Ciao,
Grazie per le tue sempre preziose indicazioni.
Mi e' capitato tempo fa di dover realizzare qualcosa di abbastanza simile al tuo controllo, facendo le chiamate AJAX in POST Bypasseresti il problema senza dover abilitare il "RelaxedUrlToFileSystemMapping" :)
#2 da Ugo Lattanzi Wednesday November 2011 alle 01:21
Ciao Tiziano,
il metodo POST è stata la mia prima opzione (e per un breve periodo è stata anche online), ma purtroppo altri javascript facevano uso di quella rotta MVC e, per mia sfortuna, non erano modificabili nell'immediato, motivo per cui la rollback sul metodo GET ha prevalso.
In ogni caso, grazie mille!