code it

Martins Tech Blog

HTTP-Status 400 trotz Inhalt

Der Anwendungsfall: Eine ajax-basierte Anwendung soll im Fehlerfall in den Ajax-Requests zwar einen Inhalt zurückgeben, der zu rendern ist, gleichzeitig aber auch einen von 200 abweichenden Statuscode, damit im Browser z.B. im JavaScript eine Unterscheidung stattfinden kann. Verkürzt und stark vereinfacht sieht das dann aus wie im folgenden Beispiel:

[HttpPost]
public ActionResult BuySomething(BuyProduct model)
{
    if (!ModelState.IsValid)
    {
        Response.StatusCode = (int)HttpStatusCode.BadRequest;
        return this.PartialView(model);
    }

    return this.PartialView("SuccessView", model);
}

Damit kann der Client nun im Fehlerfall zusätzliche Aktionen durchführen.

Im IIS7 funktioniert das out-of-the-box leider nicht, da hier mit Standardeinstellungen der Body-Content in der Antwort ersetzt wird. Um dieses Verhalten anzupassen, gibt es das Attribut existingResponse im Element system.webServer / httpErrors.

<system.webServer>
  <httpErrors existingResponse="PassThrough"></httpErrors>
</system.webServer>

Setzt man den Wert auf PassThrough, ersetzt der IIS den Content nicht, wenn gleichzeitig ein Statuscode >= 400 gesetzt wird.

maxRequestLength vs. maxAllowedContentLength

Wer sich mit Dateiuploads beschäftigt wird sich früher oder später Gedanken über Dateigrößenbeschränkungen machen wollen oder müssen.

Die Einstellung dafür findet sich in der web.config. Jedoch gibt es dabei gewisse Dinge zu beachten:

  1. Die MSDN ist sehr spärlich mit Informationen zu den Stellen an denen Änderungen notwendig sind und den vorhandenen Abhängigkeiten.
  2. Je nach verwendeter IIS-Version sind unterschiedliche Werte anzupassen.

Konfiguration des IIS

Relevant ist das Attribut maxAllowedContentLength im Element system.webServer / security / requestFiltering / requestLimits. Zu beachten ist hier, dass dieser Wert in Byte ist. Für Dateigrößen von 20 MB ist hier daher 20971520 einzutragen.

Konfiguration der ASP.NET Runtime

Relevant ist das Attribut maxRequestLength im Element system.web / httpRuntime. Zu beachten ist, dass dieser Wert in Kilobyte ist. Für Dateigrößen von 20 MB ist hier daher 20480 einzutragen. Wird der IIS 6 verwendet, spielt maxAllowedContentLength keine Rolle und es muss nur maxRequestLength angepasst werden.