2009-05-05 3 views
3

Nous avons fixé une limite fixe sur la taille du fichier des téléchargements sur notre site - en dessous de la taille du asp.net par défaut et iis réglage.Affichage d'une erreur meaningfull lors du téléchargement d'un trop grand fichier

J'ai une configuration de catch simple dans Application_BeginRequest qui attrape ceci (ce n'est pas excat puisqu'il vérifie la ContentLength y compris toutes les autres données de forme mais c'est assez bon). Je souhaite soit reprendre le traitement de la page sur laquelle l'utilisateur a tenté de télécharger, soit rediriger l'utilisateur vers une page en expliquant que la taille du fichier était trop grande (nous avons déjà un sous-titre expliquant cela, mais vous connaissez les utilisateurs 'ils n'ont pas besoin de lire des sous-titres puants').

Alors, quel est le problème? Eh bien, il semble que ma réponse a déjà été envoyée à l'utilisateur - un 404 expliquant que la page n'a pas pu être trouvée. Je ne veux pas de ce comportement, je veux vider cette réponse, car ce n'est pas celui que je veux que l'utilisateur voit - je veux montrer autre chose - construire ma propre réponse, rediriger ou simplement traiter la page qu'ils étaient censés obtenir de toute façon.

Je pense que le problème pourrait encore rejeter la demande IIS/poste depuis le fichier est plus grand que ce que veut IIS. Je vraiment creuser ceci - un utilisateur fou essayant de télécharger une image 20meg ne devrait pas être autorisé à DoS l'IIS à ses genoux, mais est-ce cela? Ou puis-je avoir une chance d'intercepter cette réponse à l'utilisateur - au lieu d'augmenter la taille maximale sur l'IIS et dépenser de la bande passante en recevant ce fichier, je veux juste identifier ce message comme étant «trop gros» et envoyer une réponse appropriée retour à l'utilisateur.

+0

Ceci est un doublon de http://stackoverflow.com/questions/674651/uploading-files-past-asp-net-request-length-limit –

Répondre

2

J'ai eu ce même problème et après beaucoup de recherche, il semble y avoir pas de solution parfaite à ce sujet. Vous pouvez modifier la longueur de requête max pour définir à quel point IIS servira l'erreur ASP.Net. Vous pouvez également attraper cette erreur sur global.asax et montrer à l'utilisateur une page d'erreur plus sympathique.

Vous pouvez trouver plus d'informations sur cette ici http://www.developer.com/db/article.php/10920_3426051_2

+0

J'ai trouvé un peu cette recherche de la question en double et j'implémente Comme nous parlons - je suis retourné à stackoverflow pour poster à ce sujet et vous me battre - donc je pourrais aussi bien signaler votre réponse correcte. Merci :) –

3

ressource Great!

J'ai utilisé le lien ci-dessus pour mettre en œuvre une prise sur les fichiers téléchargés vers le serveur qui était trop grand et être redirigé vers la page d'erreur par défaut

web.config ->

< customErrors mode="RemoteOnly" defaultRedirect="~/GenericError.htm" /> 

MaPage. aspx.cs ->

protected void Page_Error(object sender, EventArgs e) 
    { 
     if (HttpContext.Current.Error is HttpException) 
      if ((HttpContext.Current.Error as HttpException).ErrorCode == -2147467259) 
      { 
       Server.ClearError(); 
       Response.Redirect(@"~/FileSizeError.htm", false); 
      } 
    } 
+0

Je n'ai pas besoin de mettre en œuvre customErrors dans le web.config, mais mettre cette méthode Page_Error directement sur la page était exactement ce que je devais résoudre l'erreur « Impossible de rediriger après les en-têtes HTTP ont été envoyés » que je suis en train de faire dans Global.asax lorsque les utilisateurs ont téléchargé un fichier trop volumineux selon le paramètre maxRequestLength défini dans le fichier web.config.Je l'ai juste fait Rediriger vers la page et rendre visible sur un message d'erreur que j'ai mis sur la page elle-même. –

0

Les réponses ci-dessus n'ont pas fonctionné pour moi sur IIS 7.5. Nous avons finalement trouvé ce qui suit:

void Application_PreSendRequestHeaders(Object sender, EventArgs e) 
{ 
    if (
     Request.Headers["Content-Length"] != null && 
     int.Parse(Request.Headers["Content-Length"]) > 150000000 && 
     Request.RawUrl.EndsWith("/Release/ProjectReleases.aspx?Mode=Create")) 
    { 
     try 
     { 
      Response.Redirect("http://anyurl", true); 
     } 
     catch (HttpException ex) 
     { 
      if (ex.Message == "Maximum request length exceeded.") 
      { 
       Server.ClearError(); 
       Response.ClearHeaders(); 
       Response.Redirect("http://www.edward-williams.com", true); 
      } 
     } 
    } 
} 

Vous n'avez pas eu à modifier la taille de téléchargement maximale. Accordé la version finale actaully définir une valeur statique pour la taille de téléchargement maximale basée sur la valeur dans le web.config et redirigé vers une page d'erreur personnalisée par rapport à cette page d'accueil, mais vous avez l'idée.