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
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>
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
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
}
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).