web-dev-qa-db-fra.com

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 principal problème 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 HttpException est levée avant que ma méthode d'action de téléchargement dans le contrôleur soit invoquée. C'est attendu.

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

Il est cependant possible d'attraper l'exception dans Application_Error dans global.asax, mais ni Response.Redirect ni Server.Transfer ne fonctionnent pour la redirection 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

42
Marcus

Lors de l'exécution sous IIS7 et vers le haut, il existe un autre paramètre:

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

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 lancera un HttpException avec le code HTTP 500 et le texte du message Maximum request length exceeded. Lorsque cette exception est levée, IIS7 tue immédiatement la connexion. Ainsi, un HttpModule qui redirige sur cette erreur ne fonctionnera que si le HttpException est géré et effacé (en utilisant Server.ClearError()) dans Application_Error() dans global.asax .cs.

Pour les fichiers téléchargés avec une taille supérieure à maxAllowedContentLength IIS7 affichera 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 plutôt la redirection sur httpErrors. Pour rediriger vers une action différente, définissez une valeur plus petite pour 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>
60
Marcus

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

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

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

3
Marcus

Le lien des évaluations de vitesse a été très utile pour résoudre le problème. Comme indiqué, le seul inconvénient était que la requête entière (et le fichier) doit être lu avant que la redirection puisse être effectuée.

Mais il peut être limité à s'exécuter uniquement lorsque la page où le contrôle de téléchargement de fichier est présent en étant chargé comme ceci

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

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

0
Tejs