0

我在 VB.NET 中工作时遇到 500 错误处理问题。

我的问题是,当抛出 500 错误时,我的网站会重定向到我的错误页面。但是,如果我检查 Chrome 中的“网络”选项卡,我会看到抛出错误的页面得到 200(OK),然后被重定向到的页面又得到 200。

我是否认为应该在引发错误的页面上返回 500 错误,并为重定向页面返回 200?

我的 web config 的错误处理设置如下:

<customErrors defaultRedirect="~/error.aspx" mode="On">
      <error statusCode="400" redirect="~/400Error.aspx" />
      <error statusCode="500" redirect="~/error.aspx?code=500" />
    </customErrors>

<httpErrors errorMode="Custom" existingResponse="Replace">
      <clear />
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" prefixLanguageFilePath="" path="/error.aspx" responseMode="ExecuteURL" />
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="500" prefixLanguageFilePath="" path="/error.aspx?code=500" responseMode="ExecuteURL" />
      <remove statusCode="400" subStatusCode="-1" />
      <error statusCode="400" prefixLanguageFilePath="" path="/400Error.aspx" responseMode="ExecuteURL" />
    </httpErrors>

但仅此一项就导致了我上面描述的问题。

我想也许我可以通过在 Global.asax 文件中使用 Application_Error 在页面上返回 500:

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Response.StatusCode = System.Net.HttpStatusCode.InternalServerError
        Server.ClearError()
        Server.Transfer("error.aspx?code=500")
    End Sub

或者通过在我的母版页中添加类似的代码在页面级别:

 Protected Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Error
        Response.StatusCode = System.Net.HttpStatusCode.InternalServerError
        Server.ClearError()
        Server.Transfer("error.aspx?code=500")
    End Sub

通过在页面级别捕获错误,我被重定向到错误页面,其结果与处理 web.config 文件中的错误所产生的结果相同。而在应用程序级别捕获错误似乎会返回错误页面而不执行重定向(?),并且在这种情况下只返回一个 200。

我已经尝试了上面代码的组合 - 我知道 Server.ClearError() 将阻止错误从“冒泡”到 web.config 级别?但是我尝试过使用和不使用那条线,但没有取得多大成功。

谁能告诉我在抛出错误的页面上返回 500 是否正确,如果是,我能做些什么来实现这一点?

4

1 回答 1

0

我发现如果我在应用程序级别抛出异常,那么我实现了返回错误页面而不重定向,以及返回500错误的结果:

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim ex = Server.GetLastError()
        //log error details
        Response.StatusCode = System.Net.HttpStatusCode.InternalServerError
        Server.ClearError()
        Throw New Exception
    End Sub

我不确定这是否是解决我的问题的最佳方法,但如果其他人觉得这很有用,我会放弃。

于 2012-08-16T12:50:16.210 回答