我在 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 是否正确,如果是,我能做些什么来实现这一点?