2010-05-03 15 views
39

Il mio problema principale è che voglio visualizzare una pagina di errore personalizzata quando un file caricato supera la dimensione consentita (maxRequestLength in web.config).Visualizza la pagina di errore personalizzata quando il caricamento del file supera la dimensione consentita in ASP.NET MVC

Quando il grande file viene caricato, viene lanciata un'HttpException prima che venga richiamato il metodo di caricamento nel controller. Questo è previsto.

Ho provato a rilevare l'eccezione in un attributo personalizzato e anche a ignorare OnException nel controller. Perché non è possibile rilevare l'eccezione nell'attributo o nel metodo OnException?

È possibile tuttavia rilevare l'eccezione in Application_Error in global.asax ma né Response.Redirect né Server.Transfer funzionano per il reindirizzamento alla pagina di errore personalizzata. Server.Transfer fornisce l'errore "impossibile elaborare la richiesta figlio" e response.redirect fornisce l'errore "Intestazioni Http già inviate".

Qualche idea?

Grazie in anticipo!

Marcus

+3

Non è una risposta alla tua domanda il controllo di caricamento file. Utilizzo SWFUpload (http://www.swfupload.org/) e imposto un limite per le dimensioni del file. In questo modo il client non sarà nemmeno in grado di avviare il caricamento di un file superiore al limite. Hai impostato il limite in JavaScript in questo modo: file_size_limit: "20 MB". Vedere doc: http://demo.swfupload.org/Documentation –

risposta

55

Quando si esegue sotto IIS7 e verso l'alto c'è un altro parametro:

<system.webServer> 
    <security> 
    <requestFiltering> 
     <requestLimits maxAllowedContentLength="10485760" /> 
    </requestFiltering> 
    </security> 
</system.webServer> 

L'impostazione di default è leggermente inferiore a 30 MB.

Per i file caricati con dimensioni tra maxRequestLength e maxAllowedContentLength IIS7 genera un HttpException con codice HTTP 500 e messaggio di testo Maximum request length exceeded. Quando viene generata questa eccezione, IIS7 interrompe immediatamente la connessione. Quindi un HttpModule che reindirizza su questo errore funziona solo se lo HttpException viene gestito e cancellato (usando Server.ClearError()) in Application_Error() in global.asax.cs.

Per file caricati con dimensioni superiori a maxAllowedContentLength IIS7 visualizzerà una pagina di errore dettagliata con il codice di errore 404 e subStatusCode 13. La pagina di errore può essere trovata in C: \ inetpub \ custerr \ it-US \ 404-13.htm

Per i reindirizzamenti su questo errore su IIS7, è consigliabile reindirizzarlo su httpErrors. Per reindirizzare ad un'azione diversa impostare un valore più piccolo per maxAllowedContentLength rispetto maxRequestLength in web.config e anche aggiungere il seguente al web.config:

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
    <remove statusCode="404" subStatusCode="13" /> 
    <error statusCode="404" subStatusCode="13" prefixLanguageFilePath="" 
     path="http://yoursite.com/Error/UploadTooLarge" responseMode="Redirect" /> 
    </httpErrors> 
</system.webServer> 
+0

Come si fa con IIS6? – Jonathan

+0

@Jonathan: vedere questa risposta http://stackoverflow.com/questions/2759193/display-custom-error-page-when-file-upload-exceeds-allowed-size-in-asp-net-mvc2/2856886#2856886 – Marcus

+1

Una cosa importante da notare è che se vuoi _avoid_ dovendo gestire gli errori HTTP _Maximum length exceeded_passati in totale, devi impostare sia 'maxRequestLength' che 'maxAllowedContentLength' nella _same size_ (il primo deve essere espresso in kilobyte mentre il secondo in byte come [spiegato qui] (http://stackoverflow.com/a/3853785/26396)). In questo modo non ci sarà una richiesta la cui dimensione rientra tra i due valori, essi possono solo essere mai più piccoli o più grandi della soglia. –

0

È necessario fare un HttpHandler personalizzato che farà questo per voi. ASP.NET interromperà automaticamente la connessione se la dimensione del caricamento è troppo grande (come hai scoperto).

3

Durante l'esecuzione su IIS6, l'ho risolto con un HttpModule gestendo BeginRequest e controllando se httpApplication.Context.Request.Length è maggiore di maxRequestLength.

Per poter reindirizzare l'intera richiesta è necessario leggere prima di reindirizzare.

vedere l'esempio di codice a questo link: http://www.velocityreviews.com/forums/t97027-how-to-handle-maximum-request-length-exceeded-exception.html

+2

La parte negativa di questa soluzione è che l'intera richiesta (e file) deve essere letta prima che il reindirizzamento possa essere eseguito. – Marcus

+0

Questa non è una brutta cosa se è l'unico modo. Qual è l'alternativa? Innanzitutto, è possibile rilevare errori di maxRequestLength superati prima che l'intera richiesta sia stata letta? Questo evento dovrebbe essere catturato nel codice, quindi è possibile eseguire un codice di preparazione e chiamare Server.Transfer. In secondo luogo, se puoi fare qualcosa prima che l'intera richiesta venga letta, e la cancelli in qualche modo, come reagisce il browser web dell'utente? Penserà che la connessione sia fallita? – Triynko

1

collegamento La velocità Eviews è stato davvero utile per risolvere il problema. Come detto, l'unico inconveniente era che l'intera richiesta (e file) deve essere letta prima che il reindirizzamento possa essere eseguito.

Ma può essere limitato per eseguire solo quando la pagina in cui è presente per essere caricato in questo modo

if (HttpContext.Current.Request.Url.ToString().Contains("UploadedPage.aspx") 
{ 
    //read and process page request 
} 
Problemi correlati