2009-07-14 11 views
11

Ho un grosso problema. Ci sono dispositivi in ​​diretta che inviano l'URL "/ updates". È un refuso dello sviluppatore per quei dispositivi. Nei log del server, sembra "/ updates +".Problema con un URL che termina con% 20

Ho un modulo di riscrittura ManageURL che gestisce tutte le richieste senza estensione. Ma questa richiesta provoca un HttpException:

System.Web.HttpException: 

System.Web.HttpException 
    at System.Web.Util.FileUtil.CheckSuspiciousPhysicalPath(String physicalPath) 
    at System.Web.HttpContext.ValidatePath() 
    at System.Web.HttpApplication.ValidatePathExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

Per come la vedo nei log, il modulo riscrittura URL non anche ottenere questo URL, quindi non può risolvere il problema lì.

Esiste un modo per gestire gli URL con ASP.NET?

+0

avremo bisogno per vedere il codice che genera l'eccezione. – Dave

+0

Stai usando il modulo di riscrittura di IIS o hai scritto il tuo modulo che esegue la riscrittura? –

risposta

16

Ok, questo è un vecchio thread, ma mi piace di aggiungere una soluzione praticabile che funziona per tutte le versioni di ASP.NET. Dai uno sguardo a this answer in a related thread. Fondamentalmente si tratta di registrarsi all'evento PreSendRequestHeaders in global.asax.cs.

In alternativa, quando in ASP.NET 4.0 o versione successiva, utilizzare <httpRuntime relaxedUrlToFileSystemMapping="true" /> in web.config.

0

Se si ha accesso al codice, perché non solo controllare "+" alla fine e rimuoverlo?

1

Secondo some, questo è in System.Web.dll:

internal static void CheckSuspiciousPhysicalPath(string physicalPath) 
{ 
    if (((physicalPath != null) && (physicalPath.Length > 0)) 
    && (Path.GetFullPath(physicalPath) != physicalPath)) 
    { 
    throw new HttpException(0x194, ""); 
    } 
} 

credo che non si può cambiare la situazione, ma non può disabilitare uno nelle impostazioni di IIS? Naturalmente, che sarebbe anche disattivare tutti gli altri controlli ... :-(

O scrivere un po 'di filtro ISAPI che viene eseguito prima che il codice di cui sopra? Scrivere un proprio modulo si dice che sia facile, secondo Handle URI hacking gracefully in ASP.NET.

oppure, create your own error page. in questa pagina (come suggerito nel link hacker URI sopra) la ricerca di testo specifico exception.TargetSite.Name, come ad esempio CheckSuspiciousPhysicalPath e se ha trovato (o semplicemente sempre) cerca current.Request.RawUrl o qualcosa del genere, cancellare l'errore e reindirizzare ad un URL riparato?

+0

Grazie. Ci scusiamo per non essere così ansiosi. Come correzione temporanea creiamo una pagina 404. E trova un modo per cambiarlo sui dispositivi. In ogni caso questo errore mi ha spinto a trovare un modulo ISAPI in grado di gestire tali problemi. – AlfeG

+0

Bentornato ;-) In realtà, credo che la risposta di Cheeso sull'utilizzo di un filtro di riscrittura ISAPI potrebbe essere una soluzione facile. Speriamo quindi che venga eseguito * prima * che il codice sopra sia eseguito - ma penso che Cheeso sia l'autore di quel filtro, e credo che l'autore sappia che è meglio. Il singolo upvote per la risposta di Cheeso è mio, quindi: hai letto quella risposta? – Arjan

+0

@AlfeG: Giusto per rispondere _ "Immagino che non puoi cambiare quello" _ >> in realtà puoi, registrandoti a 'PreSendRequestHeaders'. Vedere la mia risposta appena aggiunta, o vedere http://stackoverflow.com/questions/429963/the-resource-cannot-be-found-error-when-there-is-a-dot-at-the-end-of- the-url/5272936 # 5272936 – Abel

1

potresti eseguire un ISAPI di riscrittura di URL, come IIRF.

+0

IIRF non era una soluzione ideale per la nostra applicazione. Sto aspettando il rilascio della versione 2.0. – AlfeG

+0

IIRF 2.0 è disponibile e disponibile, sebbene non definitivo. Ma non c'è nulla nel motore di riscrittura per IIRF v2.0 che non è possibile ottenere in IIRF v1.2.16. – Cheeso

+0

Come ho scritto nei commenti della mia risposta: presumo che IIRF venga eseguito prima di qualsiasi sicurezza integrata in IIS? Quindi, è possibile riscrivere completamente qualsiasi URL (o: semplicemente rimuovere uno spazio finale errato) prima di gestire il controllo su IIS, quindi prima che venga richiamato 'CheckSuspiciousPhysicalPath'. Destra? Sembra una buona soluzione per me, ma il singolo upvote è ancora mio. Mi manca il punto qui? – Arjan

Problemi correlati