2009-04-24 74 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。我真的很喜歡** for循環**的想法使用** InnerException **。你有沒有找到一些代碼來拉這些IIS錯誤代碼? – jp2code 2014-03-28 14:00:08

+0

僅供參考:您的代碼忽略顯示任何對「Server.ClearError();的調用」;如果那不在那裏,您應該添加它。 – jp2code 2014-03-28 14:03:22

回答

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版」。

我能想到的唯一的其他事情就是查看HttpException的ErrorCode屬性中的HRESULT,並查看是否有可能在位級別發生的事情,您可以從中找出代碼和子代碼。

不知道是否有幫助。

-2

你不想要內部異常。你想:

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

這將如何幫助我檢索401.5或403.4的IIS狀態碼? GetHttpCode仍然返回一個整數。 – Bullines 2009-04-24 19:06:15

相關問題