ASP.NET - come mostrare una pagina di errore durante il caricamento di file di grandi dimensioni (lunghezza massima richiesta superata)?

StackOverflow https://stackoverflow.com/questions/126167

Domanda

Applicazione in grado di registrare errori in OnError, ma non siamo in grado di eseguire alcun reindirizzamento per mostrare qualcosa di significativo all'utente. Qualche idea? So che possiamo impostare maxRequestLength in web.config, ma comunque l'utente può superare questo limite e alcuni errori normali devono essere visualizzati.

È stato utile?

Soluzione

Come dici tu puoi impostare maxRequestLength in web.config (sovrascrivendo i 4 MB predefiniti di machine.config) e se questo limite viene superato, di solito viene visualizzato un errore HTTP 401.1.

Per gestire un errore HTTP generico a livello di applicazione, puoi impostare una sezione CustomError nel tuo web.config nella sezione system.web:

<system.web>
   <customErrors mode=On defaultRedirect=yourCustomErrorPage.aspx />
</system.web>

Ogni volta che viene mostrato l'errore, l'utente verrà reindirizzato alla tua pagina di errore personalizzata.

Se vuoi una pagina specializzata per ogni errore puoi fare qualcosa del tipo:

<system.web>    
   <customErrors mode="On" defaultRedirect="yourCustomErrorPage.aspx">
     <error statusCode="404" redirect="PageNotFound.aspx" />
   </customErrors>
</system.web>

E così via.

In alternativa, puoi modificare la scheda CustomErrors delle proprietà della tua directory virtuale da IIS in modo che punti alle tue pagine di gestione degli errori.

Quanto sopra non sembra funzionare per gli errori 401.x: questo articolo di progetto di codice spiega una soluzione per un problema che sembra essere molto simile: Reindirizzamento alla pagina 401 personalizzata

Altri suggerimenti

Sfortunatamente, probabilmente avrai bisogno di IIS7 e catturarlo con un gestore personalizzato, dal momento che IIS6 non raggiungerà mai la fase in cui può vedere la dimensione del file. Riesce a conoscere le dimensioni solo al termine del caricamento o in caso di errore.

Questo è un problema noto in ASP.NET. Un'altra alternativa (zoppa) è gestirla prima nella richiesta e magari usare un uploader basato su flash. John si collega a diversi link di seguito .

Aggiornamento : Jon Galloway sembrava avere ha approfondito questo problema e sembra che un uploader RIA sia l'unica alternativa sensata, dal momento che IIS sembra dover sempre ingoiare il file E POI dirtelo che è troppo grande.

Sergei,

Per la risposta di JohnIdol, devi impostare una pagina di errore personalizzata per lo statuscode 413 . per esempio:.

    <customErrors mode="On" defaultRedirect="~/Errors/Error.aspx">
                    <error statusCode="413" redirect="~/Errors/UploadError.aspx"/>
    </customErrors>

Lo so perché ho dovuto risolvere lo stesso problema su un progetto client, e questa è stata la soluzione che ha funzionato per me. Purtroppo è stata l'unica soluzione che ho trovato ... non è stato possibile rilevare questo particolare problema nel codice; ad esempio, controllando la lunghezza del file pubblicato come suggerito da snomag o rilevando un errore in global.asax. Come te, avevo provato anche questi altri approcci prima di trovare una soluzione funzionante. (in realtà alla fine l'ho trovato da qualche parte sul web mentre stavo lavorando al mio problema).

Spero che sia d'aiuto.

Dovresti essere in grado di rilevare l'errore nel gestore Global.asax - OnError (). Sfortunatamente, la tua richiesta iniziale sarà terminata e non sarai in grado di eseguire il rendering della stessa pagina di caricamento con una notifica di errore all'utente.

Quello che puoi fare al massimo è visualizzare una pagina di errore amichevole con una semplice clausola di reindirizzamento all'interno del gestore OnError () e su quella pagina per avere qualche back link o funzionalità simili per riportare l'utente alla pagina in cui ha attivato l'errore in primo luogo.

Aggiornamento:

Ho dovuto implementare un controllo esatto sul caricamento dei file di recente e quello che mi è venuto in mente è SWFUpload che ha incontrato totalmente le mie esigenze e ha anche molte funzionalità aggiuntive. L'ho usato insieme al wrapper jquery fornito da Steve Sanderson. Maggiori dettagli sono disponibili qui .

Il punto è che Flash è in grado di rilevare la dimensione del file sul lato client e reagire correttamente se si verifica questo caso. E penso che questo sia esattamente ciò di cui hai bisogno.

Inoltre, è possibile implementare il controllo del rilevamento flash se si desidera eseguire il degerade con grazia sul pulsante di caricamento nativo0 nel caso in cui il client non abbia Flash installato.

Il modo migliore per gestire caricamenti di grandi dimensioni è utilizzare una soluzione che implementa un HttpModule che spezzerà il file in blocchi. Qualunque delle soluzioni pre-rollate disponibili dovrebbe consentire di limitare le dimensioni del file. Molti altri hanno pubblicato link a quelli su questa pagina, quindi non mi preoccuperò. Tuttavia, se non vuoi preoccuparti che puoi gestirlo nell'evento Global_asax Application_Error della tua app. Se l'applicazione è .NET 4.0, inserisci questo blocco di codice:

    if (ex.InnerException != null && ex.InnerException.GetType() == typeof(HttpException) && ((HttpException)ex.InnerException).WebEventCode == System.Web.Management.WebEventCodes.RuntimeErrorPostTooLarge)
    {
        //Handle and redirect here, you can use Server.ClearError() and Response.Redirect("FileTooBig.aspx") or whatever you choose
    }

Fonte: http://justinyue.wordpress.com/2010/10/29/handle-the-maximum-request-length-exceeded-error-for-asyncfileupload-control/

Se stai eseguendo un framework precedente, prova qui il codice (è in VB, ma è facile da tradurre): http://www.webdeveloper.com/forum/showthread.php?t=52132

Puoi controllare la lunghezza del file pubblicato (FileUpload.PostedFile.ContentLength), per vedere se è al di sotto del limite o meno e mostrare semplicemente un messaggio di errore amichevole, se necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top