Afficher la page d’erreur personnalisée lorsque le téléchargement de fichier dépasse la taille autorisée dans ASP.NET MVC

Mon problème principal est que je souhaite afficher une page d’erreur personnalisée lorsqu’un fichier téléchargé dépasse la taille autorisée (maxRequestLength dans web.config).

Lorsque le gros fichier est téléchargé, une exception HttpException est lancée avant que ma méthode d’action de téléchargement dans le contrôleur ne soit appelée. Ceci est prévu.

J’ai essayé d’attraper l’exception dans un atsortingbut personnalisé et de remplacer OnException dans le contrôleur. Pourquoi n’est-il pas possible d’attraper l’exception dans l’atsortingbut ou la méthode OnException?

Il est toutefois possible d’attraper l’exception dans Application_Error dans global.asax mais ni Response.Redirect ni Server.Transfer ne fonctionnent pour redirect vers la page d’erreur personnalisée. Server.Transfer donne l’erreur “Échec du traitement de la demande enfant” et response.redirect donne l’erreur “En-têtes HTTP déjà envoyés”.

Des idées?

Merci d’avance!

Marcus

Lors de l’exécution sous IIS7 et plus, il existe un autre paramètre:

       

Le paramètre par défaut est légèrement inférieur à 30 Mo.

Pour les fichiers téléchargés dont la taille est comprise entre maxRequestLength et maxAllowedContentLength IIS7 lance une HttpException avec le code HTTP 500 et le texte du message. Maximum request length exceeded . Lorsque cette exception est levée, IIS7 tue la connexion immédiatement. Ainsi, un HttpModule qui redirige cette erreur ne fonctionnera que si l’ HttpException est gérée et effacée (à l’aide de Server.ClearError() ) dans Application_Error() dans global.asax.cs.

Pour les fichiers téléchargés dont la taille est supérieure à maxAllowedContentLength IIS7 affiche une page d’erreur détaillée avec le code d’erreur 404 et subStatusCode 13. La page d’erreur se trouve dans C: \ inetpub \ custerr \ en-US \ 404-13.htm

Pour les redirections sur cette erreur sur IIS7, je recommande la redirection sur httpErrors place. Pour redirect vers une action différente, définissez une valeur plus faible pour maxAllowedContentLength que maxRequestLength dans web.config et ajoutez également les éléments suivants à web.config:

       

Lors de l’exécution sur IIS6, je l’ai résolu avec un HttpModule en gérant le BeginRequest et en vérifiant si httpApplication.Context.Request.Length est plus grand que maxRequestLength.

Pour pouvoir redirect toute la demande, il faut la lire avant de la redirect.

Voir l’exemple de code à ce lien: http://www.velocityreviews.com/forums/t97027-how-to-handle-maximum-request-length-exceeded-exception.html

Le lien «velocity eviews» était vraiment utile pour résoudre le problème. Comme indiqué, le seul inconvénient était que la requête entière (et le fichier) doivent être lus avant que la redirection puisse être effectuée.

Mais il peut être limité à s’exécuter uniquement lorsque la page sur laquelle se trouve le contrôle de téléchargement de fichiers est chargée comme ceci

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

Vous devez créer un HttpHandler personnalisé qui le fera pour vous. ASP.NET va automatiquement tuer la connexion si la taille du téléchargement est trop grande (comme vous l’avez découvert).