webentwicklung-frage-antwort-db.com.de

Wie kann ich in ASP.Net einen Statuscode 500 senden und trotzdem auf die Antwort schreiben?

Ich besitze einen ASP.Net-Einzeldatei-Webdienst (ein .ashx Datei mit einer IHttpHandler Implementierung), die in der Lage sein muss, Fehler als Antworten mit 500 Internal Server Error Statuscodes zurückzugeben. Dies ist relativ einfach in PHP zu tun:

header("HTTP/1.1 500 Internal Server Error");
header("Content-Type: text/plain");
echo "Unable to connect to database on $dbHost";

Das ASP.Net (C #) -Äquivalent sollte sein:

Context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
Context.Response.ContentType = "text/plain";
Context.Response.Write("Unable to connect to database on " + dbHost);

Das funktioniert natürlich nicht wie erwartet; Stattdessen fängt IIS den 500-Statuscode ab, verwirft alles, was ich in das Response -Objekt geschrieben habe, und sendet je nach App entweder Debug-Informationen oder eine benutzerdefinierte Fehlerseite konfiguriert ist.

Meine Frage - wie kann ich dieses IIS Verhalten unterdrücken und Fehlerinformationen direkt von meiner IHttpHandler Implementierung senden?

Diese App ist ein Port von PHP; Die Client-Seite ist bereits geschrieben, daher bleibe ich im Wesentlichen bei dieser Spezifikation. Das Senden von Fehlern mit einem Statuscode von 200 passt leider nicht in die Form.

Im Idealfall muss ich das Verhalten programmgesteuert steuern, da dies Teil eines SDK ist, das wir verteilen möchten, ohne dass " diese Datei bearbeitet " und " ändere diese IIS Einstellung "Zusatzanleitung.

Vielen Dank!

Bearbeiten: Sortiert. Context.Response.TrySkipIisCustomErrors = true war das Ticket. Wow.

64
Neil E. Pearson

Context.Response.TrySkipIisCustomErrors = true

108
Neil E. Pearson

Ich habe in der Vergangenheit Folgendes verwendet und konnte einen 503-Fehler mit einer benutzerdefinierten Meldung auslösen, indem ich den unten in der Page Load-Methode gezeigten Code verwendete. Ich verwende diese Seite hinter einem Load Balancer als Ping-Seite, damit der Load Balancer erkennt, ob ein Server in Betrieb ist oder nicht.

Hoffe das hilft.

        protected void Page_Load(object sender, System.EventArgs e)
    {
        if (Common.CheckDatabaseConnection())
        {
            this.LiteralMachineName.Text = Environment.MachineName; 
        }
        else
        {
            Response.ClearHeaders();
            Response.ClearContent(); 
            Response.Status = "503 ServiceUnavailable";
            Response.StatusCode = 503;
            Response.StatusDescription= "An error has occurred";
            Response.Flush();
            throw new HttpException(503,string.Format("An internal error occurred in the Application on {0}",Environment.MachineName));  
        }
    }
10
Paige Cook

Möglicherweise möchten Sie eine customErrors-Seite einrichten (über die Datei web.config konfigurierbar). Sie können Ihre Inhalte über mehrere Anforderungen hinweg in der Sitzung (oder über einen alternativen Mechanismus) speichern. Anschließend muss asp.net so konfiguriert sein, dass die benutzerdefinierte Fehlerseite angezeigt wird, auf der wiederum Ihre benutzerdefinierte Ausgabe angezeigt wird.

Ein Wort der Vorsicht: Wenn der 500 aufgrund eines grundlegenden Problems mit der Anwendung (dh StackOverflowException) verursacht wird und Sie versuchen, eine Seite anzuzeigen, die von asp.net abhängt (dh MyCustomErrors.aspx), könnten Sie in landen eine Schleife.

Weitere Informationen finden Sie unter diese Seite .

0
Bobby D