2009-04-24 4 views
6

Je gestion des exceptions avec un HttpModule d'une manière telle que celui-ci:Comment puis-je obtenir le code du sous-système IIS à partir d'une exception?

int errorCode = 500; 
HttpApplication httpApp = (HttpApplication)sender; 

try 
{ 
    if (httpApp.Server != null) 
    { 
     Exception ex; 

     for (ex = httpApp.Server.GetLastError(); ex != null; ex = ex.InnerException) 
     { 
      try 
      { 
       HttpException httpEx = ex as HttpException; 
       if (httpEx != null) 
        errorCode = httpEx.GetHttpCode(); 

       // ... retrieve appropriate content based on errorCode 
      } 
      catch { } 
    } 
} 

Pour HTTP status codes (ex: 302, 404, 503, etc.) tout fonctionne très bien. Cependant, pour IIS status codes (ex: 401.5, 403.4, etc.), GetHttpCode peut-il les récupérer car sa valeur de retour est un entier?

+0

+1. J'aime vraiment cette ** idée de boucle ** en utilisant le ** InnerException **. Avez-vous déjà trouvé un peu de code pour extraire ces codes d'erreur IIS? – jp2code

+0

FYI: Votre code a été négligé pour afficher un appel à 'Server.ClearError();' Si ce n'est pas le cas, vous devez l'ajouter. – jp2code

Répondre

2

Vous ne pouvez pas. Voir l'avant-dernière réponse ici: http://www.velocityreviews.com/forums/t73739-sending-status-as-4011.html. La RFC HTTP ne définit pas de sous-codes (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html). Il semble que ce soit une chose de MS seulement - voir la dernière réponse dans le premier lien, qui pointe vers ici: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.substatuscode.aspx. Bien que ce soit de savoir comment définir le sous-statut, ne pas le récupérer, la chose intéressante pour moi est qu'il est seulement pris en charge "avec le mode pipeline intégré dans IIS 7.0 et au moins la version 3.0 .NET Framework." La seule autre chose que je peux penser est de regarder dans le HRESULT dans la propriété ErrorCode sur le HttpException et de voir s'il se passe quelque chose au niveau du bit où vous pouvez trouver le code et le sous-code de cela.

Je ne sais pas si cela aide ou non.

+0

En outre, à partir de ce lien MSDN: "Lorsque vous définissez la propriété SubStatusCode, ... le code n'est jamais envoyé dans le cadre de la réponse finale à la demande." –

-2

Vous ne voulez pas l'exception interne. Vous voulez:

HttpException httpEx = httpApp.Server.GetLastError() as HttpException; 
if (httpEx != null) 
    errorcode = httpEx == null ? 0 : httpex.GetHttpCode(); 
+0

Comment cela va m'aider à récupérer un code d'état IIS comme 401.5 ou 403.4? GetHttpCode renvoie toujours un entier. – Bullines

Questions connexes