2010-05-03 5 views
39

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).Afficher la page d'erreur personnalisée lorsque le téléchargement dépasse la taille autorisée dans ASP.NET MVC

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 invoquée. C'est prévu.

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

Il est cependant possible d'intercepter 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 renvoie l'erreur "failed to process child request" et response.redirect renvoie l'erreur "Http headers already sent".

Des idées?

Merci d'avance!

Marcus

+3

Pas une réponse à votre question. J'utilise SWFUpload (http://www.swfupload.org/) et fixe une limite de taille de fichier. De cette façon, le client ne pourra même pas commencer à télécharger un fichier supérieur à la limite. Vous définissez la limite dans JavaScript comme suit: file_size_limit: "20 Mo". Voir doc: http://demo.swfupload.org/Documentation –

Répondre

55

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

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

Le réglage par défaut est légèrement inférieure à 30 Mo.

Pour les fichiers téléchargés avec la taille entre maxRequestLength et maxAllowedContentLength IIS7 jetteront un HttpException avec le code HTTP 500 et un message texte Maximum request length exceeded. Lorsque cette exception est levée, IIS7 tue la connexion immédiatement. Donc 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 plus grande que maxAllowedContentLength IIS7 affiche une page d'erreur détaillé 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 de rediriger sur httpErrors à la place. Pour rediriger vers une action différente définir une valeur plus petite pour maxAllowedContentLength que maxRequestLength dans web.config et ajoutez également les éléments suivants à 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

Comment faites-vous cela avec IIS6? – Jonathan

+0

@Jonathan: Voir cette réponse http://stackoverflow.com/questions/2759193/display-custom-error-page-when-file-upload-exceeds-allowed-size-in-asp-net-mvc2/2856886#2856886 – Marcus

+1

Une chose importante à noter est que si vous ne voulez pas avoir à gérer les erreurs HTTP 500 _Maximum request length exceeded_ errors, vous devez définir à la fois 'maxRequestLength' et' maxAllowedContentLength' à la même taille_ (la première doit être exprimée en kilo-octets tandis que le dernier en octets comme [expliqué ici] (http://stackoverflow.com/a/3853785/26396)). De cette façon, il n'y aura pas de requête dont la taille se situe entre les deux valeurs, elles ne pourront jamais être plus petites ou plus grandes que le seuil. –

0

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

3

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

Pour être en mesure de rediriger l'ensemble de la demande doit être lu avant de rediriger.

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

+2

La partie négative de cette solution est que toute la requête (et le fichier) doit être lue avant que la redirection puisse être effectuée. – Marcus

+0

Ce n'est pas une mauvaise chose si c'est le seul moyen. Quelle est l'alternative? Premièrement, est-il possible de détecter les erreurs dépassées par maxRequestLength avant que toute la requête ait été lue? Cet événement devra être capturé dans le code, de sorte que vous pouvez exécuter du code de préparation et appeler Server.Transfer. Deuxièmement, si vous pouvez faire quelque chose avant que toute la requête soit lue, et que vous l'annuliez d'une manière ou d'une autre, comment le navigateur Web de l'utilisateur répond-il? Pense-t-il que la connexion a échoué? – Triynko

1

lien eviews La vitesse était vraiment utile pour résoudre le problème. Comme indiqué, le seul inconvénient était que toute la requête (et le fichier) devait être lue avant que la redirection puisse être effectuée.

Mais il peut se limiter à courir que lorsque la page où le contrôle de téléchargement de fichier est présent en étant chargé comme celui-ci

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