我尝试手动重定向应用程序错误,如下所示:
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
Dim routeData = New RouteData()
routeData.Values.Add("controller", "Error")
routeData.Values.Add("action", "Index")
'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
在我的ErrorController中,我有这个动作:
Function Index() As ActionResult
'get the exception
Dim ex = Server.GetLastError()
...do something with the exception...
Return View()
End Function
当我这样做时,即使我试图返回自定义视图,我也只是得到了YSOD。如果我尝试使用Server.Transfer
重定向到我的控制器,则Transfer
调用将失败。如果我尝试使用TransferRequest
,它会转移,但GetLastError
会返回null。
那么如何进行这种转移以便(1)我可以返回我想要的视图而不是YSOD; (2)保留最后一个异常?
答案 0 :(得分:0)
经过一系列的研究,我做了以下更改,现在它似乎有效:
在错误事件中:
Server.ClearError() '<-------------added this line
Dim routeData = New RouteData()
routeData.Values.Add("controller", "Error")
routeData.Values.Add("action", "Index")
routeData.Values.Add("exception", Server.GetLastError()) '<-------------added this line
'route to the error controller, preserving the context
Dim controller As IController = New Controllers.ErrorController()
controller.Execute(New RequestContext(New HttpContextWrapper(Context), routeData))
将操作方法签名更改为:
' GET: /Error
Function Index(exception As Exception) As ActionResult
这会导致action方法接收异常对象并解决我的问题。