我在这样的代码中实现了一个自定义错误处理程序:
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
'get the exception
Dim ex = Server.GetLastError()
'log it
ex.LogToFile()
'clear the error
Server.ClearError()
'build route data to route this exception to ErrorController
Dim routeData = New RouteData()
routeData.Values.Add("controller", "Error")
routeData.Values.Add("action", "Index")
routeData.Values.Add("exception", ex)
'route to the error controller, preserving the context
Dim controller As IController = New Controllers.ErrorController()
controller.Execute(New RequestContext(New HttpContextWrapper(Context), routeData))
End Sub
然后/error/index
操作方法以用户友好的方式显示异常。在我的开发机器上,这很好用。但是在部署的服务器上,当抛出异常而不是我的错误消息时,它会尝试使用预设错误页面,例如%SystemDrive%\inetpub\custerr\<LANGUAGE-TAG>\500.htm
。
如果我指定自己的500页,它会使用它,但没有我的自定义处理。
如果我像这样删除500页:
<httpErrors>
<remove statusCode="500" subStatusCode="-1" />
</httpErrors>
我只是通过这条消息得到了一个白色的死亡屏幕:
The page cannot be displayed because an internal server error has occurred.
那么,我怎样才能让我的错误处理做正确的事呢?
答案 0 :(得分:0)
我感觉HandleErrorAttribute
造成了这种情况。检查Global.asax和App_Start / FilterConfig.vb以查看是否存在filters.Add(New HandleErrorAttribute())
之类的行。
如果使用HandleErrorAttribute
并且启用了自定义错误,MVC将在MVC工作流程中保留所有未处理的异常。这意味着来自views / controllers / etc的任何未处理的异常都不会冒泡到ASP.NET或IIS以允许Application_Error
查看异常,并且您将在/Views/Shared/Errors.vbhtml上看到视图< / p>
查看您的代码,您几乎可以执行HandleErrorAttribute
所做的事情。如果您只是尝试返回一个简单的失败视图,该属性允许您设置它使用的默认视图而不是一般的错误视图。
答案 1 :(得分:0)
似乎IIS确实想要处理500个错误,除非您明确告诉它不要使用以下代码行:
'force our handling, instead of IIS handling
Response.TrySkipIisCustomErrors = True
本文提供了大量有关此内容的信息:
http://weblog.west-wind.com/posts/2009/Apr/29/IIS-7-Error-Pages-taking-over-500-Errors