2009-04-24 7 views
6

Я обработки исключений с HttpModule способом, например, как это:Как я могу получить код подстановки IIS из исключения?

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 { } 
    } 
} 

Для HTTP status codes (например: 302, 404, 503 и т.д.) все работает отлично. Однако, для IIS status codes (например: 401.5, 403.4 и т. Д.), Может ли GetHttpCode получить их, поскольку его возвращаемое значение является целым числом?

+0

+1. Мне очень нравится ** идея loop ** с использованием ** InnerException **. Вы когда-нибудь находили немного кода, чтобы вытащить эти коды ошибок IIS? – jp2code

+0

FYI: ваш код пренебрег, чтобы показать любой вызов 'Server.ClearError();' Если этого нет, вы должны добавить его. – jp2code

ответ

2

Возможно, вы не сможете. См. Второй-последний ответ здесь: http://www.velocityreviews.com/forums/t73739-sending-status-as-4011.html. HTTP RFC не определяет подкоды (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html). Похоже, что это может быть только MS - см. Последний ответ в первой ссылке, который затем указывает на это: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.substatuscode.aspx. Хотя это так, как установить код подкатегория, а не извлекать его, мне интересно, что он поддерживается только «с интегрированным режимом конвейера в IIS 7.0 и, по крайней мере, с .NET Framework версии 3.0».

Единственное, что я могу придумать, это заглянуть в HRESULT в свойстве ErrorCode в HttpException и посмотреть, есть ли что-то на уровне бит, где вы можете найти код и подкод из этого.

Не знаю, помогает ли это.

+0

Кроме того, из этой ссылки MSDN: «Когда вы устанавливаете свойство SubStatusCode, ... код никогда не отправляется как часть окончательного ответа на запрос». –

-2

Вы не хотите внутреннего исключения. Вы хотите:

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

Как это поможет мне получить код статуса IIS, например, 401.5 или 403.4? GetHttpCode по-прежнему возвращает целое число. – Bullines