17 Stimmen

Verhindern des Hochladens großer Dateien in ASP.NET 4.0

Wir möchten die maximale Dateigröße beim Hochladen auf unserer Website begrenzen. Wir haben bereits die entsprechenden Grenzen in unserer web.config festgelegt. Das Problem, auf das wir stoßen, ist, wenn eine wirklich große Datei (z. B. 1 GB) hochgeladen wird, wird die gesamte Datei hochgeladen wird, bevor ein serverseitiger Fehler generiert wird, und die Art des Fehlers ist unterschiedlich, unabhängig davon, ob die Datei groß ist oder nicht.

Gibt es eine Möglichkeit, die Größe eines anstehenden Datei-Uploads zu erkennen, bevor der eigentliche Upload stattfindet?

Hier sind 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 erstellen, damit ich eine Anforderung zu einem frühen Zeitpunkt im Anforderungslebenszyklus abfangen kann, aber die Uploads scheinen bereits vor dem BeginRequest Veranstaltung von 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();
        }
    }
}

Aktualisierung:

Ich weiß, dass clientseitige Technologien wie Flash die Dateigrößen vor dem Hochladen erkennen können, aber wir brauchen einen serverseitigen Workaround, weil wir Plattformen ansprechen wollen, die keine Unterstützung für Flash/Java/ActiveX/Silverlight haben. Ich glaube, dass IIS oder ASP.NET einen Fehler haben, der das Hochladen großer Dateien trotz der Begrenzungen erlaubt, deshalb habe ich einen Fehler gemeldet ici .

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

Update 2:

Seufzer . Microsoft hat den Fehler, den ich eingereicht habe, als Duplikat geschlossen, aber keine weiteren Informationen geliefert. Hoffentlich haben sie in dieser Sache nicht einfach den Ball fallen gelassen.

Update 3:

Hurra! Nach Angaben von Microsoft:

Dieser Fehler wird derzeit behoben, da er an das IIS-Produktteam weitergeleitet wurde. Das IIS-Team hat den Fehler inzwischen behoben und wird ihn in zukünftige Windows-Versionen aufnehmen.

3voto

David Punkte 70550

Gibt es eine Möglichkeit, die Größe eines Datei zu erkennen, bevor der eigentliche Upload Upload stattgefunden hat?

Nein. Dazu müsste der Client Zugriff auf die Dateigröße haben. Einem Webserver direkten Zugriff auf Dateien auf dem Client zu gestatten, wäre ein wenig gefährlich.

Am besten ist es, wenn Sie eine Textzeile einfügen, in der die maximal zulässige Dateigröße angegeben ist.

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

3voto

Cyril Gupta Punkte 13086

Das Problem ist, dass der Upload mit Hilfe der HTTP-Post-Anforderung auf einmal erfolgt, so dass Sie ihn erst nach Abschluss erkennen können.

Wenn Sie mehr Kontrolle darüber haben möchten, sollten Sie Flash-basierte Upload-Widgets ausprobieren, die dies und mehr bieten. Sehen Sie sich diesen Link an http://www.ajaxline.com/10-most-interesting-upload-widgets

3voto

Jacob Punkte 75084

Microsoft hat antwortete auf ihrer Microsoft Connect-Website mit den folgenden:

Dieser Fehler wird derzeit behoben, da er auf das IIS-Produktteam portiert wurde. Das IIS-Team hat den Fehler inzwischen behoben und wird ihn in zukünftige Windows-Versionen aufnehmen.

Wenn Sie eine Korrektur für das aktuelle Betriebssystem wünschen, muss ein QFE-Antrag gestellt werden. Bitte lassen Sie mich wissen, ob Sie diesen Weg einschlagen möchten. Bitte beachten Sie, dass die Eröffnung eines QFE-Antrags nicht unbedingt bedeutet, dass er genehmigt wird.

Wir müssen also auf die nächste Version von IIS warten, um das Problem zu beheben (es sei denn, ein QFE-Antrag wird erfüllt, was auch immer dass ist).

1voto

3Dave Punkte 27742

Nun.... Das hängt davon ab, wie tief Sie einsteigen wollen.

Erstellen Sie eine Dienstanwendung, die als Proxy für IIS fungiert. (Alle eingehenden Socket-Anfragen an Port 80 gehen an den Dienst.) Der Dienst leitet alles, was er empfängt, an IIS weiter (die Website wird an einem anderen Port oder einer anderen IP-Adresse abgehört), überwacht aber die Gesamtgröße der empfangenen Anfragen. Wenn die Größe einer gegebenen Verbindung die von Ihnen gewünschte Grenze überschreitet, schließen Sie die Verbindung. Wenn Sie höflich sein wollen, leiten Sie auf eine Fehlerseite um.

Das ist zwar albern, aber so können Sie die Daten während der Übertragung überwachen, ohne darauf warten zu müssen, dass der IIS die Anfrage übergibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X