2009-03-23 3 views
1

J'ai cherché SO et trouvé this question, mais ce n'est pas tout à fait ce que je demande. Je me demande si un IHttpModule peut être créé pour inspecter ContentLength de la requête, et si c'est le cas, soit rediriger, soit rejeter cette requête et en créer une nouvelle. En particulier, j'essaie de gérer les téléchargements de fichiers image, mais j'aimerais que la demande continue sur la page de téléchargement avec une sorte d'avertissement plutôt qu'une page d'erreur plate. J'ai ce morceau de code qui est frappé avec une grande demande:Téléchargement de fichiers dépassant la limite de longueur de la requête Asp.net?

private void context_BeginRequest(object sender, EventArgs e) 
    { 
     HttpApplication application = (HttpApplication)sender; 
     HttpContext context = application.Context; 

     if (context.Request.ContentLength > (4 * 1024 * 1024)) 
     { 

     } 
    } 

Le chemin d'exécution entre dans ce bloc IF comme je veux. Mais d'ici, je ne suis pas vraiment sûr de l'endroit où aller. Est-ce une mauvaise approche? Edit: En l'état (sans ce module), Fiddler signale que IIS retourne un code 500. Je voudrais éviter cela et avoir le code retourner un 200 de la page demandée, juste avec l'avertissement comme je l'ai dit.

Répondre

4

En raison de la nature de HTTP, vous ne pouvez pas retourner quoi que ce soit tant que vous n'avez pas lu toutes les données de la requête. Lorsque vous recevez une demande surdimensionnée, vous avez deux options:

  • Lisez toutes les données et renvoyez une page d'erreur. Cela sonne bien, mais signifie que l'utilisateur doit attendre la fin du téléchargement avant de recevoir le message qu'il ne peut pas télécharger. Il ouvre également un trou d'attaque DOS possible
  • Terminez la demande immédiatement. Cela donne à l'utilisateur une page de déconnexion merdique, mais préserve la sécurité.

Il existe une troisième option: utilisez un composant avancé qui fournit à la fois de jolis messages d'erreur et une sécurité. Vous pouvez utiliser des composants flash seulement, et il y en a beaucoup, mais bien sûr, si l'utilisateur n'a pas flash, vous n'avez pas de chance.

+0

Est-ce la raison pour laquelle le lien fourni par rm appelle ReadEntityBody dans une boucle? – Amy

+0

Oui, exactement. Il lit dans toute la demande afin qu'il puisse envoyer une réponse après. –

1

Donnez this une lecture

0

Si tout ce que vous êtes désireux de faire est de donner des commentaires des utilisateurs sur l'état des transferts importants d'image, alors je vous recommande envisager d'utiliser l'un des composants de téléchargement basé sur Ajax ou Flash. Il y en a environ un million et la plupart ont de très bons retours d'utilisateurs. Ils peuvent également traiter des fichiers volumineux et beaucoup prennent en charge plusieurs téléchargements simultanés de fichiers.

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("/ProjectReleases.aspx?Mode=Create", StringComparison.OrdinalIgnoreCase)) 
     { 
      try 
      { 
       Response.Redirect("http://anyurl", true); 
      } 
      catch (HttpException ex) 
      { 
       if (String.Compare(ex.Message, "Maximum request length exceeded.", StringComparison.Ordinal) != 0) 
       { 
        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 max 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.

Questions connexes