500使用WebForms进行错误处理

问题描述:

我在使用VB.NET进行500错误处理时遇到问题。500使用WebForms进行错误处理

我的问题是,当一个500错误被抛出,我的网站重定向到我的错误页面。但是,如果我在Chrome浏览器中检查网络标签,则会看到我为导出错误的页面获取了200(确定),然后为重定向到的页面添加了200。

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

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

<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> 

但在这个问题单独以上结果我形容。

我想,也许我可以通过使用的Application_Error Global.asax文件返回页面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()将停止从'bubbling'到web.config级别的错误?但是,我尝试过没有这条路线,但没有取得太大的成功。

任何人都可以告诉我,如果这是正确的返回页面上引发错误的500,如果是这样,我能做些什么来实现这一目标?

我发现,如果我扔在应用层面的例外,那么我实现返回错误页面,而不会重定向,以及返回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 

我不知道,如果这是解决我的问题的最好方法,但是如果其他人发现这个问题有用的话,我们会留下来。