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.
+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. –
kann sein, können Sie auf diese beziehen: http://stackoverflow.com/questions/14032918/setting-maxrequestlength -programmatisch/14033087 # 14033087 –