web-dev-qa-db-fra.com

Comment envoyer un code d'état 500 dans ASP.Net et toujours écrire dans la réponse?

J'ai un service Web ASP.Net à fichier unique (un .ashx fichier contenant une implémentation IHttpHandler) qui doit pouvoir renvoyer des erreurs sous forme de réponses avec des codes d'état 500 Internal Server Error. C'est une chose relativement simple à 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'équivalent ASP.Net (C #) 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; à la place, IIS intercepte le code d'état 500, supprime tout ce que j'ai écrit dans l'objet Response et envoie des informations de débogage ou une page d'erreur personnalisée, selon la façon dont l'application est configuré.

Ma question - comment puis-je supprimer ce comportement IIS et envoyer des informations d'erreur directement à partir de mon implémentation IHttpHandler?

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

Idéalement, je dois contrôler le comportement par programme, car cela fait partie d'un SDK que nous voulons distribuer sans " éditer ce fichier " et " modifiez ces instructions supplémentaires IIS setting ".

Merci!

Modifier: trié. Context.Response.TrySkipIisCustomErrors = true était le ticket. Sensationnel.

64
Neil E. Pearson

Context.Response.TrySkipIisCustomErrors = true

108
Neil E. Pearson

J'ai utilisé ce qui suit dans le passé et j'ai pu envoyer une erreur 503 avec un message personnalisé en utilisant le code indiqué ci-dessous dans la méthode▶Load. J'utilise cette page derrière un équilibreur de charge comme page ping pour l'équilibreur de charge pour 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));  
        }
    }
10
Paige Cook

Vous pouvez souhaiter définir une page customErrors (configurable via le web.config). Vous pouvez stocker votre contenu sur plusieurs demandes dans Session (ou via un autre mécanisme), puis configurer asp.net pour afficher la page d'erreur personnalisée qui à son tour affiche votre sortie personnalisée.

Un mot d'avertissement, cependant: si le 500 est dû à un problème fondamental avec l'application (ie StackOverflowException) et que vous essayez d'afficher une page qui dépend d'asp.net (ie MyCustomErrors.aspx), vous pouvez vous retrouver dans une boucle.

Pour plus d'informations, consultez cette page .

0
Bobby D