IIS: Größenlimit für Dateiuploads erhöhen (maxRequestLength)

IIS: Größenlimit für Dateiuploads erhöhen (maxRequestLength)

Der IIS besitzt ein Größenlimit für hochgeladene Dateien, wie man es von so ziemlich jedem anderen Webserver auch kennt. Standardmäßig liegt dies bei 4 MB – Für rein textbasierte Formulare also völlig ausreichend. Möchte man jedoch eine Upload-Funktion für Dateien in einer ASP.NET Webanwendung integrieren, stößt man damit schnell an seine Grenzen. In diesem Fall bricht der IIS die Anfrage mit der Fehlermeldung Die Maximale Anforderungsgröße wurde überschritten ab.

Zunächst müssen wir dafür das Attribute maxRequestLength auf den gewünschten Wert erhöhen:

<configuration>
    <system.web>
        <httpRuntime maxRequestLength="16384" />
    </system.web>
</configuration>

Die Abgabe erfolgt in Kilobytes und entspricht in diesem Beispiel daher 16 MB. Sollte der httpRuntime-Knoten bereits vorhanden sein, darf er nicht erneut definiert werden. Man kann ihn einfach mit dem Attribut erweitern. Beispiel:

<httpRuntime targetFramework="4.5.2" maxRequestLength="16384" />

Für alte IIS-Installationen dies aus. Die Aktuellen ab IIS Version 7 benötigen zusätzlich noch folgende Direktive:

<system.webServer>
   <security>
      <requestFiltering>
         <!-- Gleiche Angabe wie maxRequestLength, jedoch in Bytes statt KB -->
         <requestLimits maxAllowedContentLength="16777216" />
      </requestFiltering>
   </security>
 </system.webServer>

Ab IIS 7 ist das Filtern von Abfragen anhand ihrer Größe nämlich ein Sicherheits-Feature, um DDoS-Attacken mit übermäßig großen Dateiuploads entgegenzuwirken. Verwirren kann an dieser Stelle jedoch die Besonderheit, dass maxAllowedContentLength in Bytes angegeben wird – Obwohl der Wert mit maxRequestLength übereinstimmen muss, der wiederum in Kilobytes vorliegt. Die 16384 KB von oben entsprechen daher an dieser Stelle 16384 KB * 1024 = 16777216 Bytes.

Weitere Maßnahmen für reibungslose Dateiuploads in ASP.NET

Timeout erhöhen

Je nach Größe der erwarteten Dateiuploads bietet es sich zudem an, den Timeout zu erhöhen. Beispielsweise auf 5 Minuten, wenn die Nutzer größere Dateien hochladen dürfen. Dazu setzt man das Attribut executionTimeout im httpRuntime Knoten:

<httpRuntime maxRequestLength="16384" executionTimeout="300" />

Ansonsten könnte der Upload durch das Erreichen des Timeouts (Standardmäßig 90 Sekunden) abgebrochen werden. Dieses Risiko droht insbesondere bei Nutzern mit langsamer Internetverbindung.

Fehlermeldung bei Exceptions anzeigen

Für den Fall, dass der Nutzer eine zu große Datei hochläd, macht das Abfangen dieser Exception Sinn. Dafür können wir das Application_Error-Event in der Global.asax nutzen, um den letzten serverseitigen Fehler auszulesen:

private void Application_Error(object sender, EventArgs e) {
    var ex = Server.GetLastError();
    var httpException = ex as HttpException ?? ex.InnerException as HttpException;
    if(httpException == null) {
        return;
    }
    if(httpException.WebEventCode == WebEventCodes.RuntimeErrorPostTooLarge) {
        // Dem Nutzer eine aussagekräftige Fehlerseite ausgeben, dass seine Datei zu groß ist
        Response.Write("Die hochgeladene Datei ist leider zu groß");
    }
}

Dies ist natürlich nur beispielhaft und führt zu einer nackten, weißen Fehlerseite. Für den Produktiveinsatz würde es sich an dieser Stelle anbieten, den Nutzer auf eine Fehlerseite zu leiten, wo er auf die maximale Größe für Uploads hingewiesen wird.

Leave a Reply