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.