2010-01-18 3 views
16

Ho un'applicazione MVC.NET con un percorso come segue:Come consentire "Caratteri illegali nel percorso"?

routes.MapRoute("member", "member/{id}/{*name}", new { controller = "member", action = "Details", id = "" }, new { id = @"\d+" });

Così, un collegamento potrebbe essere qualcosa di simile: http://domain/member/123/any_kind_of_username

Questo funziona bene in generale, ma se il percorso contiene illegale caratteri (es. doppio qoute: http://domain/member/123/my_ "utente" _name) Ottengo un "System.ArgumentException: caratteri non validi nel percorso".

Dopo molti googling sembra essere il suggerimento migliore per assicurarsi che l'URL non contenga tali caratteri. Sfortunatamente, questo è fuori dal mio controllo in questo caso.

C'è un modo per aggirare questo problema?

+2

presumibilmente sono chiamati caratteri non validi perché non è possibile utilizzarli ... –

+0

Non è possibile che questi siano codificati URL? – Oded

+1

@Mitch - Beh, una virgola doppia, ad esempio, funziona bene per Apache, quindi non vedo perché IIS non lo consentirebbe. @Oded - Il problema è che non ho il controllo di questi URL. – hbruce

risposta

1

È necessario codificare URL l'URL sul lato client prima di inviarlo. Prova a utilizzare il metodo UrlHelper.Encode.

+0

Siamo spiacenti, la stessa cosa qui come con gli altri suggerimenti finora. Temo di non avere il controllo degli URL alla fine dei clienti. – hbruce

+3

Lo capisco anche quando l'URI codificato viene inviato dal client – IsmailS

4

Si scopre che è possibile evitare ciò impostando allowDoubleEscaping = "false" in per requestFiltering in web.Config. cioè:

<configuration> 
    <system.webServer> 
    <security> 
     <requestFiltering allowDoubleEscaping="false" /> 
    </security> 
    </system.webServer> 
</configuration> 

Forse non la soluzione perfetta (suggerimenti per uno migliore è molto apprezzato), ma risolve il problema.

+0

@hbruce: È la soluzione migliore che ho trovato finora, grazie! – PanJanek

+1

effetto collaterale abbastanza serio - non puoi più usare caratteri come '+' negli URL se abiliti questa impostazione. consultare: http://stackoverflow.com/questions/1453218/is-enabling-double-escaping-dangerous –

0

Che dire di una e commerciale (&) nell'URL? Ad esempio: mysite.com/JellyBeans/PB & J, dove "PB & J" è un valore di parametro in un metodo di azione del controller. Come fai a evitare che MVC e il motore ASP.NET trattino questo come un carattere illegale nella stringa dell'URL di base? Codifica che con un% 26 non sembra funzionare. Una cosa strana, quando si avvia il debug di VS il server web locale (VS web server integrato) gestisce bene quel caso (sia come & sia come% 26), ma quando viene distribuito su un server Web che esegue IIS7 l'url risulta in una "Richiesta errata" ".

+2

Il server Web incorporato VS.NET è piuttosto bug e non conforme agli standard. Se ti imbatti in comportamenti strani, ti conviene ignorarlo e basta usare IIS. –

7

Scott Hanselman ha registrato una buona sintesi su allowing illegal characters in the path.

Se davvero si vuole consentire caratteri che sono limitate, rimuoverli dalla lista modificando il web.config (questo sarà probabilmente solo lavorare in .NET 4 e sulla IIS7):

<system.web> 
    <httpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters="&lt;,&gt;,*,%,:,&amp;,\" /> 
</system.web> 

potrebbe anche essere necessario fare come hbruce suggests:

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

ci sono ancora alcuni determinati percorsi TH a non funzionerà, (come/search /%) come si otterrà il messaggio 400 "Richiesta non valida - URL non valido". L'unica soluzione che ho trovato è quella di usare quella parte come querystring:/search? Q =% con i passaggi precedenti.

+0

Esiste un'alternativa per .net 2? – lathomas64