65 votes

Comment envoyer un code d'état 500 dans ASP.Net et écrire quand même dans la réponse?

J'ai un ASP.Net web à fichier unique (un .ashx le fichier contenant un IHttpHandler mise en œuvre) qui doit être en mesure de retourner les erreurs comme des réponses à 500 Internal Server Error codes d'état. C'est relativement simple chose à faire en PHP:

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

L'ASP.Net (C#) équivalent doit être:

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

Bien sûr, cela ne fonctionne pas comme prévu; au lieu de cela, IIS intercepte les 500 code d'état, des ordures de tout ce que j'ai écrit à l' Response objet, et envoie les informations de débogage ou une page d'erreur personnalisée, en fonction de la façon dont l'application est configurée.

Ma question: comment puis - je supprimer ce IIS comportement et d'envoyer des informations d'erreur directement à partir de mon IHttpHandler mise en œuvre?

Cette application est un port de PHP; le côté client est déjà écrit, donc je suis bloqué avec cette spécification. L'envoi d'erreurs avec un code d'état 200, malheureusement, ne rentre pas dans le moule.

Idéalement, j'ai besoin de contrôler le comportement de la programmation, parce que cela fait partie d'un kit de développement logiciel nous voulons distribuer sans "modifier ce fichier" et "modifier ce paramètre IIS" notice complémentaire.

Merci!

Edit: Triés. Context.Response.TrySkipIisCustomErrors = true a été le billet. Wow.

110voto

Neil E. Pearson Points 1194

Context.Response.TrySkipIisCustomErrors = true

11voto

Paige Cook Points 13415

J'ai utilisé ce qui suit dans le passé et ai été en mesure de générer une erreur 503 avec un message personnalisé à l'aide du code présenté ci-dessous dans la méthode Page_Load. J'utilise cette page derrière un équilibreur de charge comme page ping pour que l'équilibreur de charge puisse savoir si un serveur est en service ou non.

J'espère que cela t'aides.

         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));  
        }
    }
 

0voto

Bobby D Points 1771

Vous pouvez définir un customErrors page (configurable via le web.config). Vous pouvez stocker votre contenu à travers les demandes de Session (ou via un autre mécanisme) alors asp.net configuré pour afficher la page d'erreur personnalisée qui affiche votre sortie personnalisés.

Un mot d'avertissement, cependant: Si la 500 est causé en raison d'un problème fondamental de l'application (c'est à dire StackOverflowException) et vous essayez d'afficher une page qui dépend de la asp.net (c'est à dire MyCustomErrors.aspx), vous pouvez vous retrouver dans une boucle.

Pour plus d'informations, consultez cette page.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X