2

我找HttpExceptions我global.asx的子的Application_ErrorServer.Transfer的(「error_404.aspx」)中的Application_Error返回一個空白頁

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) 

     Dim ex As Exception = HttpContext.Current.Server.GetLastError() 

     If ex IsNot Nothing Then 
      If TypeOf (ex) Is HttpUnhandledException Then 
       If ex.InnerException Is Nothing Then 
        Server.Transfer("error.aspx", False) 
       End If 
       ex = ex.InnerException 
      End If 

      If TypeOf (ex) Is HttpException Then 
       Dim httpCode As Integer = CType(ex, HttpException).GetHttpCode() 
       If httpCode = 404 Then 
        Server.ClearError() 
        Server.Transfer("error_404.aspx", False) 
       End If 
      End If 
     End If 
End Sub 

我可以通過這個代碼步,確認它確實擊中Server.Transfer(「error_404.aspx」)以及error_404.aspx的Page_Load,但它顯示的只是一個空白頁面。

+0

確保將呼叫添加到您的錯誤記錄系統。如果發生未處理的異常,你想知道,所以你可以去處理它。 – tsilb 2010-03-28 01:44:28

回答

4

您是否清除響應緩衝區?您不知道已經存在的內容,因爲您正在Application_Error catch-all中執行此操作。 Server.Transfer只是追加新頁面生成到現有的響應。顯然這可能會造成一些問題。

+0

這實際上是發生了什麼。 server.transfer拋出一個異常,因爲它的輸出緩衝區不是空的 – kenwarner 2010-03-30 00:57:23

0

請問如果你改變了Server.TransferResponse.Redirect工作? (您可能必須使用來自global.asax中的HTTPContext.Current前綴。)

我不確定Server.Transfer是否是您正在執行的操作的上下文中的一個好主意,因爲您有效地要求IIS將global.asax URL呈現給瀏覽器。

+0

如果我使用Response.Redirect,它將生成一個HTTP 302,然後重定向到error_404.aspx。我想生成一個404請求並顯示error_404.aspx的內容,同時保持url與原始請求相同。根據您的第二條評論,我如何讓IIS呈現global.asax?我認爲Server.Transfer(「error_404.aspx」)意味着它會問IIS渲染error_404.aspx – kenwarner 2010-03-27 03:08:56

+0

有道理..我在這篇小文章中設法犯了兩個錯誤。也許我會刪除並等待真正的答案... – LesterDove 2010-03-27 03:28:30

0

我想如果發生一些錯誤,Server.Transfer不會觸發。

Server.Transfer對此不是一個好方法。試用Response.Redirect。它應該工作。

如果您有任何異常,是否有任何要求維護狀態?如果不是,請使用Response.Redirect

+0

就像我說的LesterDove,如果我使用Response.Redirect,我最終得到2個迴應。原始頁面,302重定向到error_404.aspx。我想生成一個單一的404響應 – kenwarner 2010-03-27 14:10:26