41 votes

Afficher une page d'erreur personnalisée lorsque le téléchargement d'un fichier dépasse la taille autorisée en 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 levée avant que ma méthode d'action de téléchargement dans le contrôleur ne soit invoquée. C'est ce qui est attendu.

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

Il est possible d'attraper l'exception dans Application_Error dans global.asax mais ni Response.Redirect ni Server.Transfer ne fonctionnent pour rediriger vers la page d'erreur personnalisée. Server.Transfer donne l'erreur "failed to process child request" et response.redirect donne l'erreur "Http headers already sent".

Des idées ?

Merci d'avance !

Marcus

58voto

Marcus Points 1348

A partir de IIS7, il existe un autre paramètre :

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

La valeur par défaut est légèrement inférieure à 30 Mo.

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

Pour les fichiers téléchargés dont la taille est supérieure à maxAllowedContentLength IIS7 affichera une page d'erreur détaillée avec le code d'erreur 404 et la mention subStatusCode 13. La page d'erreur se trouve à l'adresse suivante C:\inetpub\custerr\en ÉTATS-UNIS \404 -13.htm

Pour les redirections sur cette erreur sur IIS7, je recommande de rediriger sur httpErrors à la place. Pour rediriger vers une autre action, diminuez la valeur de maxAllowedContentLength que maxRequestLength dans web.config et ajoutez également ce qui suit à 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>

3voto

Marcus Points 1348

Sous IIS6, j'ai résolu le problème avec un HttpModule en gérant le BeginRequest et en vérifiant si httpApplication.Context.Request.Length est plus grand que maxRequestLength.

Pour pouvoir rediriger, il faut lire l'intégralité de la demande avant de procéder à la redirection.

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

1voto

user455406 Points 11

Le lien vers velocity eviews a été très utile pour résoudre le problème. Comme indiqué, le seul inconvénient est que l'intégralité de la requête (et du fichier) doit être lue avant que la redirection puisse être effectuée.

Mais il est possible de limiter son exécution à la page où se trouve le contrôle de téléchargement de fichiers en la chargeant comme suit

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

0voto

Tejs Points 23834

Vous devez créer un HttpHandler personnalisé qui fera cela pour vous. ASP.NET interrompt automatiquement la connexion si la taille du téléchargement est trop importante (comme vous l'avez constaté).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X