Errore “La risorsa non può essere trovata.” Quando c’è un “punto” alla fine dell’URL

Sto usando ASP .NET MVC Beta e ottengo l’errore HTTP 404 (La risorsa non può essere trovata) quando uso questo URL che ha un “punto” alla fine:

http: // localhost: 81 / Title / Edit / Code1 .

Se rimuovo il punto alla fine o il punto è da qualche parte nel mezzo non ottengo l’errore.

Ho provato a eseguire il debug ma ho ricevuto l’errore da “System.Web.CachedPathData.GetConfigPathData (String configPath)” prima di ProcessRequest in MvcHandler.

“Dot” non è consentito alla fine di un url? O c’è un modo per correggere la definizione della rotta per gestire questo URL?


Per un esempio: ho una tabella denominata Detail1 [Id (numero intero), Code (stringa), Descrizione (stringa)] che ha una relazione FK con Master1 attraverso la sua colonna Id. Ogni volta che seleziono un record di Master1, seleziono anche il record Detail1 per ottenere il campo Codice. Per non rendere questo join ogni volta (poiché di solito non c’è un solo dettaglio, ce ne sono più di uno) scelgo di non usare la colonna Id e creo il codice PK di Detail1.

Ma quando mi sbarazzo di Id e uso il codice come PK, i miei percorsi iniziano anche a lavorare con il campo Codice, come: Dettagli1 \ Modifica \ Codice1

Questo Codice può avere qualsiasi cosa al suo interno o alla fine, incluso DOT. Ci sono casi in cui posso vietare un DOT alla fine, ma a volte è davvero significativo.

E ho anche visto questo post che i percorsi possono essere molto flessibili, quindi non pensavo che il mio fosse così strano.

Ecco perché faccio qualcosa di così non standard. Eventuali suggerimenti?

E anche perché è così strano avere un DOT alla fine di un url?

Se si utilizza .NET 4.0, è ansible impostare questo flag nella sezione system.web del proprio web.config e sarà consentito:

 

L’ho provato e funziona. Haack ne ha una spiegazione.

Questo può essere risolto in due modi in ogni versione ASP.NET dalla 1.0 in su. So che sono passati due anni dalla creazione di questo thread, ma comunque, ecco qui:

Causa

La creazione del gestore di errori personalizzato o la configurazione di una pagina personalizzata in IIS per redirect il 404 non funzioneranno. Il motivo è che ASP.NET considera questo URL pericoloso. Internamente in System.Web.Util.FileUtil , ASP.NET chiama un metodo privato IsSuspiciousPhysicalPath , che tenta di associare il percorso a un nome file (virtuale ma legale).

Quando il percorso legalizzato risultante non è uguale al percorso originale, l’elaborazione si interrompe e il codice ASP.NET restituisce un 404 (non richiede IIS o il web.config per il 404 personalizzato, ne restituisce uno stesso, il che lo rende così difficile fare qualcosa per questo).

Esplora risorse funziona allo stesso modo. Prova a creare un nome di file che termina con uno o più punti, ad esempio test.txt. . Troverete che il nome risultante è text.txt .

Soluzione per terminare l’URL in un punto in ASP.NET

La soluzione è semplice (una volta che lo sai, lo è sempre). Appena prima di inviare questo 404, chiamerà Application_PreSendRequestHeaders , un evento semplice a cui è ansible registrarsi in Global.asax.cs (o l’equivalente VB). Il seguente codice restituirà un semplice testo al browser, ma è ansible anche un reindirizzamento o qualsiasi altra risposta valida.

 protected void Application_PreSendRequestHeaders(object sender, EventArgs e) { HttpResponse response = this.Context.Response; HttpRequest request = this.Context.Request; if (request.RawUrl.EndsWith(".")) { response.ClearContent(); response.StatusCode = 200; response.StatusDescription = "OK"; response.SuppressContent = false; response.ContentType = "text/plain"; response.Write("You have dot at the end of the url, this is allowed, but not by ASP.NET, but I caught you!"); response.End(); } } 

Nota: questo codice funziona anche quando “aspx” non fa parte dell’URL. Ad esempio, http://example.com/app/somepath . chiamerà quell’evento Si noti inoltre che alcuni percorsi non funzioneranno (terminando con più punti, con un hash-tag o un <-sign, ad esempio, genera una 400- Bad Request). Poi di nuovo, funziona per finire su una citazione, uno spazio + barra, o più punti separati da spazi.

Bene, in .NET 4.5 ho risolto questo problema aggiungendo “/” alla fine dell’URL.

Quindi, nel tuo caso sarebbe “http: // localhost: 81 / Title / Edit / Code1. /”. Era l’unica cosa che ho fatto, non ho dovuto aggiungere l’impostazione httpRuntime.

aggiungi questo ai gestori

    

Forse http://localhost:81/Title/Edit/Code1%2E funzionerebbe.

Sono sfuggito al periodo con un codice ascii hex.

Perché non puoi avere un URI terminato da punti?

Poiché un URI è una richiesta di risorsa e esiste un imperativo storico su tutti i sistemi operativi rilevanti che il carattere punto è il separatore dell’estensione . L’ultimo punto viene considerato come denotante un’estensione di file, quindi la terminazione dei punti non ha senso.

Vale anche la pena leggere

  • RFC1738
  • RFC3986