IIS überschreibt meinen Antwortinhalt, wenn ich den Response.StatusCode manuell festlege

20

Problem

Wenn ich den Wert HTTP Statusmeines Antwort-Streams manuell auf " 404oder" 503stelle, rendert IIS den aktuellen IIS-Inhalt / die aktuelle IIS-Ansicht anstelle meiner benutzerdefinierten Ansicht.

Wenn ich das mit dem Webentwicklungsserver (AKA. Cassini ) mache , funktioniert es korrekt (das heißt, mein Inhalt wird angezeigt und die response.statuscode== meine eingegebenen Daten).

Kann ich dieses Verhalten auf irgendeine Weise außer Kraft setzen?

Replizieren

Erstellen Sie eine Standard-ASP.NET MVC1-Webanwendung. Fügen Sie die folgende Route hinzu

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",
        "{*catchall}",
        new { controller = "Home", action = "Index" }
        );

}

Ersetzen Sie nun die Index-Methode des HomeControllers durch ...

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        Response.StatusCode = 404;
        return View();
    }
}
Pure.Krome
quelle

Antworten:

18

Ok - fand die Antwort. Wie erwartet entführt IIS meine nicht 200 Antworten. Nicht sicher (dh ich bin nicht sicher, ob dies das Standardverhalten ist, ODER es liegt an einer Einstellung, die eines der Teammitglieder in der Maschinenkonfiguration aktualisiert hat, usw.).

Auf jeden Fall lautet der Schlüssel hier, IIS anzuweisen, keine Ressourcen mit Nicht-200-Statusergebnissen zu verarbeiten.

Wie? Config-Eintrag in der web.config.

<system.webServer>
    <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough"/>
    .... snipped other IIS relevant elements ... 
</system.webServer>

Jetzt ist der Schlüssel hier existingResponse="PassThrough". Dieser böse Junge weist IIS an, meine Ressourcen in Ruhe zu lassen, wenn der HTTP-Statuscode! = 200 ist.

Wünschen Sie weitere Informationen? Sicher: Lesen Sie mehr über dieses Element auf der offiziellen IIS-Website .

Pure.Krome
quelle
httperrors ist wie Fehlerseiten -> 500 -> Featureeinstellungen bearbeiten -> "Detailed Errors" _http: //stackoverflow.com/questions/2640526/detailed-500-error-message-asp-iis-7-5_
Kiquenet
aaaahhh .. Gute alte IIS machen einfache Dinge schwierig :)
AR
4

Eine andere Möglichkeit, dies zu umgehen, besteht darin, den folgenden Code in Ihrer ASP-Anwendung auszuführen:

Response.TrySkipIisCustomErrors = true;

Quelle: /programming//a/21271085/238753

Sam
quelle
-2

Seien Sie vorsichtig mit diesem Ansatz im Allgemeinen. Sie sollten KEINE Sicht auf den 404-Status rendern.

  • Ich denke, wenn ein Fehlerstatuscode zurückgegeben wird, gibt IIS die Statusfehlerseite zurück, die bei ihm registriert ist - nicht die Ausgabe der Verarbeitung. Sie können dort also eine HTML-Seite (oder einen Link zu einer Aspx-Seite) einfügen. http://professionalaspnet.com/archive/2008/02/13/Enforcing-a-Custom-404-Page-in-ASP.NET.aspx enthält eine nützliche Erklärung zum Einrichten einer Fehlerseite.

  • Das ist aber irrelevant. Eine ganze Reihe von Browsern zeigt standardmäßig NICHT diese Ausgabe an, sondern etwas, das im Browser eingestellt ist. Wenn Sie sich also darauf verlassen, dass die Leute Ihre 404-Seite sehen, kann dies nicht passieren. Sie sehen möglicherweise die 404-Seite, die im Browser für sie eingerichtet ist.

TomTom
quelle
1
Warum sollte ich eine Ansicht auf einem 404 nicht rendern? Ich möchte eine benutzerdefinierte Seite, und meine Seite erfordert möglicherweise einige Logik (anstelle einer statischen HTML-Fehlerseite).
Pure.Krome
Das MVC-Modell lässt sich nicht in das IIS-Fehlerseitenmodell integrieren. So einfach. Dazu müssen Sie zum IIS-Modell zurückkehren. Registrieren Sie eine Seiten-URL für den 404-Fall. Legen Sie dort eine dynamische Seite ab - ich bin nicht sicher, ob dies tatsächlich auf eine MVC-URL zurückführen KÖNNTE, aber sie MUSS aus der Registrierung von 404-Seiten stammen.
TomTom
Falsch. Die meisten Browser rendern den Inhalt einer Seite, die mit dem HTTP-Status 404 zurückgegeben wird. Nicht alle, aber die meisten. Außerdem berücksichtigt IIS standardmäßig den Statuscode, der von einem Code in einer .NET-Site festgelegt wurde, solange keine anderen Module den Code später in der Pipeline überschreiben. Lesen Sie in der Antwort des Fragestellers nach, wie dies in diesem Fall geschehen ist.
Mufasa