2009-03-23 3 views
1

Ich suchte SO und fand this question, aber es ist nicht ganz das, was ich frage. Ich frage mich, ob ein IHttpModule erstellt werden kann, die die ContentLength der Anfrage überprüfen kann, und wenn ja, entweder umleiten oder irgendwie diese Anfrage auswerfen und eine neue erstellen.Upload von Dateien nach Asp.net Anfrage Länge Limit?

Insbesondere versuche ich, Bilddatei-Uploads zu behandeln, aber ich möchte die Anfrage auf der Upload-Seite mit einer Art Warnung statt einer flachen Fehlerseite fortsetzen. Ich habe dieses Stück Code, der mit einer großen Anfrage getroffen wird:

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

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

     } 
    } 

Der Ausführungspfad betritt diesen IF-Block wie ich es will. Aber von hier aus bin ich mir nicht sicher, wohin ich gehen soll. Ist das ein schlechter Ansatz?

Edit: Wie es ist (ohne dieses Modul) meldet Fiddler, dass IIS einen 500-Code zurückgibt. Ich möchte das vermeiden und den Code 200 von der angeforderten Seite zurückgeben, nur mit der Warnung, wie ich sagte.

Antwort

4

Aufgrund der Art von HTTP können Sie nichts zurückgeben, bis Sie alle Anforderungsdaten gelesen haben. Wenn Sie eine übergroße Anfrage erhalten, haben Sie zwei Optionen:

  • Lesen Sie alle Daten und dann eine schöne Fehlerseite zurück. Das hört sich gut an, bedeutet aber, dass der Benutzer warten muss, bis der Upload abgeschlossen ist, bevor er die Nachricht erhält, die er nicht hochladen kann. Es öffnet auch eine mögliche DOS-Angriffsloch
  • Beenden Sie die Anfrage sofort. Dies gibt dem Benutzer eine beschissene Trennseite, behält jedoch die Sicherheit bei.
  • Es gibt eine dritte Option - verwenden Sie eine erweiterte Komponente, die sowohl nette Fehlermeldungen als auch Sicherheit bietet. Sie können nur Flash-Komponenten verwenden, und es gibt viele davon, aber wenn der Benutzer keinen Flash hat, haben Sie natürlich kein Glück.

    +0

    Ist dies der Grund, warum die von RM bereitgestellte Verbindung ReadEntityBody in einer Schleife aufruft? – Amy

    +0

    Ja, genau. Es liest die gesamte Anfrage ein, so dass es später eine Antwort senden kann. –

    1

    Geben this ein Lese

    0

    Wenn alles, was Sie tun wollen, sind die Nutzer-Feedback über den Status von Großbild-Uploads ist geben, dann würde ich empfehlen, halten Sie eine der Ajax oder Flash-basierten Upload-Komponenten. Es gibt ungefähr eine Million von ihnen, und die meisten haben sehr gute Benutzerrückmeldungen. Sie können auch mit großen Dateien umgehen, und viele verarbeiten auch mehrere gleichzeitige Datei-Uploads.

    0

    Die obigen Antworten funktionierten bei IIS 7.5 nicht für mich. Wir haben uns schließlich folgendes einfallen lassen:

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

    Die maximale Uploadgröße musste nicht geändert werden. Gewährt die finale Version actully einen statischen Wert für die maximale Upload-Größe basierend auf dem Wert in der web.config und umgeleitet auf eine benutzerdefinierte Fehlerseite gegen diese Homepage, aber Sie bekommen die Idee.