【问题标题】:Server.Transfer("error_404.aspx") in Application_Error returns a blank pageApplication_Error 中的 Server.Transfer("error_404.aspx") 返回空白页
【发布时间】:2011-02-01 10:40:56
【问题描述】:

我在 global.asx 的 Application_Error 子中查找 HttpExceptions

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,但它显示的只是一个空白页面。

【问题讨论】:

  • 确保向您的错误记录系统添加调用。如果发生未处理的异常,您想知道以便处理它。

标签: asp.net global-asax http-status-codes httpexception application-error


【解决方案1】:

您是否正在清除响应缓冲区?您不知道已经存在什么,因为您在 Application_Error 包罗万象中执行此操作。 Server.Transfer 只是将新页面生成的任何内容附加到现有响应中。显然这可能会产生一些问题。

【讨论】:

  • 这基本上就是正在发生的事情。 server.transfer 抛出异常,因为它的输出缓冲区不为空
【解决方案2】:

如果将Server.Transfer 更改为Response.Redirect 是否有效? (您可能必须使用您在 global.asax 中的 HTTPContext.Current 前缀。)

我不确定 Server.Transfer 是否适合您正在做的事情,因为您实际上是在要求 IIS 将 global.asax URL 呈现给浏览器。

【讨论】:

  • 如果我使用 Response.Redirect,它会生成一个 HTTP 302,然后重定向到 error_404.aspx。我想生成一个 404 请求并显示 error_404.aspx 的内容,同时保持 url 与原始请求相同。根据您的第二条评论,我如何要求 IIS 呈现 global.asax?我以为 Server.Transfer("error_404.aspx") 意味着它会要求 IIS 呈现 error_404.aspx
  • 有道理.. 我设法在那篇小帖子中犯了两个错误。也许我会删除并等待真正的答案......
【解决方案3】:

我认为如果发生错误,Server.Transfer 不会触发。

Server.Transfer 不是一个好的方法。试试Response.Redirect。它应该可以工作。

如果您有任何例外,是否有任何维护状态的要求?如果没有,请使用Response.Redirect

【讨论】:

  • 就像我对 LesterDove 说的那样,如果我使用 Response.Redirect,我最终会得到 2 个响应。 302 重定向到 error_404.aspx 的原始页面。我想生成一个 404 响应
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 2014-04-19
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多