2010-10-25 12 views
14

Wir möchten die maximale Upload-Dateigröße auf unserer Website beschränken. In unserer web.config haben wir bereits die entsprechenden Grenzen gesetzt. Das Problem, das wir begegnen, ist, wenn eine wirklich große Datei (1 GB, zum Beispiel) hochgeladen wird, die gesamte Datei wird hochgeladen, bevor ein serverseitigen Fehler generiert wird, und der Typ des Fehlers ist unterschiedlich, ob die Die Datei ist riesig oder nicht.Verhindern des Hochladens von großen Dateien in ASP.NET 4.0

Gibt es eine Möglichkeit, die Größe eines ausstehenden Dateiuploads zu ermitteln, bevor der eigentliche Upload stattfindet?

Hier ist meine relevanten web.config Einstellungen, die Anfragen auf 16 MB beschränken:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.web> 
     <httpRuntime maxRequestLength="12288"/> 
    </system.web> 

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

Ich habe versucht, ein HTTP-Modul zu schaffen, damit ich eine Anfrage in der frühen Anfrage Lifecycle abfangen konnte, aber die Uploads scheinen stattfinden, noch bevor der BeginRequest Fall HttpApplication:

public class UploadModule : IHttpModule 
{ 
    private const int MaxUploadSize = 12582912; 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += handleBeginRequest; 
    } 

    public void Dispose() 
    { 
    } 

    private void handleBeginRequest(object sender, EventArgs e) 
    { 
     // The upload takes place before this method gets called. 

     var app = sender as HttpApplication; 

     if (app.Request.Files.OfType<HttpPostedFile>() 
      .Any(f => f.ContentLength > MaxUploadSize)) 
     { 
      app.Response.StatusCode = 413; 
      app.Response.StatusDescription = "Request Entity Too Large"; 
      app.Response.End(); 
      app.CompleteRequest(); 
     } 
    } 
} 

Update:

Ich weiß, dass clientseitige Technologien wie Flash Dateigrößen vor dem Upload erkennen können, aber wir benötigen eine serverseitige Problemumgehung, da wir auf Plattformen abzielen möchten, die keine Flash/Java/ActiveX/Silverlight-Unterstützung haben. Ich glaube, dass IIS oder ASP.NET einen Fehler hat, der es erlaubt, große Dateien trotz der Beschränkungen hochzuladen, also habe ich einen Bug here eingereicht.

Würde eine ISAPI-Erweiterung mir mehr Kontrolle über die Verarbeitung von Anforderungen geben als HTTP-Module und Handler, z. B. um einen Upload abzubrechen, wenn der Content-Length-Header größer ist als der zulässige Grenzwert?

Update 2:

Sigh. Microsoft hat den Fehler, den ich als Duplikat abgelegt habe, geschlossen, aber keine zusätzlichen Informationen bereitgestellt. Hoffentlich haben sie den Ball nicht einfach fallen lassen.

Update 3:

Hooray! Laut Microsoft:

Dieser Fehler wurde behoben, da er auf das IIS-Produktteam portiert wurde. Das IIS-Team hat den Fehler behoben, der in zukünftigen Versionen von Windows enthalten sein wird.

+0

+1 auf die Frage; Ich bin selbst an diesem Thema interessiert. Mein Verständnis ist, dass Sie nichts damit anfangen können, bis die ganze Anfrage hereinkommt, und sicherlich hat der Code, den Sie versuchen zu verwenden, keine Möglichkeit, vorher zu wissen. Ich denke, es würde etwas früher in der Anfrage-Pipeline brauchen; wie auf der Client-Seite, oder bevor IIS/ASP.NET die Anfrage bekommt - wie die Anfrage beginnt zu strömen. –

+0

kann sein, können Sie auf diese beziehen: http://stackoverflow.com/questions/14032918/setting-maxrequestlength -programmatisch/14033087 # 14033087 –

Antwort

2

Microsoft responded on their Microsoft Connect site mit Folgendes:

Dieser Fehler behoben wird, wie es in dem II-Produktteam portiert wurde. Das IIS-Team hat den Fehler behoben, der in zukünftigen Versionen von Windows enthalten sein wird.

Wenn Sie eine Fehlerbehebung für das aktuelle Betriebssystem anfordern, muss eine QFE-Anforderung geöffnet werden. Bitte lassen Sie mich wissen, ob dies die Route ist, die Sie nehmen möchten. Bitte beachten Sie, dass das Öffnen einer QFE-Anfrage nicht unbedingt bedeutet, dass sie genehmigt wird.

Also denke ich, dass wir für die nächste Version von IIS für das Update warten müssen (es sei denn, ein QFE Wunsch vollständig erfüllt ist, was auch immer dass ist).

2

Gibt es eine Möglichkeit, die Größe eines anstehenden Datei-Upload vor den eigentlichen Upload erfolgt zu erkennen?

Nein. Das würde Zugriff auf die Dateigröße auf dem Client erfordern. Es wäre ein bisschen gefährlich, einem Webserver direkten Zugriff auf Dateien auf dem Client zu gewähren.

Am besten platzieren Sie eine Textzeile mit der maximal zulässigen Dateigröße.

ODER Sie könnten eine Art von ActiveX-Steuerelement, Java-Applet usw. erstellen, so dass Sie nicht von Browser-Einschränkungen abhängig sind.Dann müssen Sie Ihre Benutzer davon überzeugen, es zu installieren. Wahrscheinlich nicht die beste Lösung.

+1

korrekt. aber es sollte einen Weg geben, die hochgeladene Dateigröße zu ermitteln, bevor die gesamte Datei auf der Serverseite hochgeladen wurde: Wir können den "Content-Length" -Header lesen, nachdem der Anfrage-Header empfangen und analysiert wurde (aber bevor die gesamte Anfrage verarbeitet wurde)). Ich werde das später aktualisieren. –

+0

Hier: http://stackoverflow.com/questions/14032918/setting-maxrequestlength-programmatically/14033087#14033087 –

2

Das Problem besteht darin, dass das Hochladen mit der HTTP-Post-Anfrage auf einmal erfolgt, so dass Sie es erst nach dem Abschluss erkennen können.

Wenn Sie mehr Kontrolle darüber wollen, sollten Sie versuchen, Flash-basierte Upload-Widgets, die dies und mehr haben. Schauen Sie sich diesen Link http://www.ajaxline.com/10-most-interesting-upload-widgets

+1

Sie machen es klingt wie dies ist eine grundlegende Einschränkung in HTTP, wo es wirklich eine Einschränkung in der Web-Server-Software ist. – Charlie

0

Nun .... hängt davon ab, wie Low-Level Sie erhalten möchten.

Erstellen Sie eine Dienstanwendung, die als Proxy für IIS fungiert. (Alle eingehenden Port-80-Socket-Anforderungen werden an den Dienst gesendet.) Lassen Sie den Dienst alle empfangenen Informationen an IIS weiterleiten (die Website überwacht einen anderen Port oder eine andere IP-Adresse), überwacht jedoch die Gesamtanforderungsgröße. Wenn die Größe einer Verbindung zum Geben die gewünschte Grenze überschreitet, schließen Sie die Verbindung. Geben Sie eine Weiterleitung zu einer Fehlerseite zurück, wenn Sie höflich sein möchten.

Dumm, aber Sie können Daten während der Übertragung überwachen, ohne darauf warten zu müssen, dass IIS die Anforderung übergibt.