2010-08-06 8 views
4

Dans asp.net, je peux définir une page d'erreur personnalisée comme ceci:personnalisée page d'erreur HTTP

<configuration> 
    <system.web> 
     <customErrors mode="On"> 
      <error statusCode="404" redirect="/servererrors/404.aspx" /> 
     </customErrors> 
    </system.web> 
</configuration> 

Maintenant ma question: Si je remplace, par exemple 404.aspx avec AnyHTTP.aspx, et que vous voulez obtenir le numéro de l'erreur http pour généraliser la page, comment puis-je obtenir ce numéro d'erreur?

Répondre

2

Essayez ce paramètre dans CustomErrors (ASP.NET 3.5 SP1):

<customErrors mode="RemoteOnly" defaultRedirect="/servererrors/AnyHTTP.aspx" RedirectMode="ResponseRewrite"/> 

Comme une autre solution, vous pouvez aussi le faire dans Global.asax:

void Application_Error(object sender, EventArgs e) 
{ 
    Server.Transfer("/servererrors/AnyHTTP.aspx"); 
} 

et sur votre page d'erreur, chargez la dernière erreur:

Exception e = Server.GetLastError(); 

Il est important d'utiliser Server.Transfer() dans le fichier Global.asax; using Response.Redirect lancera une erreur 302 et vous perdrez l'erreur que vous vouliez attraper.

0

Je vous recommande de ne pas utiliser la méthode web.config. customErrors redirige vers la page d'erreur, ce qui n'a pas de sens. Essentiellement, il dit d'abord "oh oui, cela fonctionnera parfaitement, vous devez juste aller ici à la place", et puis dit "oh, nous n'avons pas trouvé cela". C'est vraiment un bug (s'il n'y a rien ici, alors pourquoi le serveur m'a-t-il dit d'aller ici, clairement au code de l'utilisateur il a l'air de vous le code du serveur foiré, ils sont allés au bon URI et ensuite vous les avez dirigés au mauvais).

Utilisez Server.Transfer() de global.asax, définissez un HTTPHandler par défaut ou définissez IIS pour exécuter (pas de redirection vers) votre fichier .aspx ou autre avec votre implémentation. Si vous voulez que le même gestionnaire gère chaque erreur, vous pouvez, par exemple, faire un Server.Transfer() à partir de global.asax, mais inclure un paramètre de chaîne de requête sur le type d'erreur (simplement un code d'état HTTP, ou quelque chose de plus détaillé), ou transmettre des informations dans le HttpContext.

Questions connexes