7

这是我在 Global.asax.vb 中尝试做的事情:

Public Class MvcApplication
    Inherits System.Web.HttpApplication

    Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
        routes.MapRoute( _
            "Error", _
            "error.html", _
            New With {.controller = "Error", _
                      .action = "FriendlyError"} _
        )
        ...
        'other routes go here'
        ...
    End Sub

    Sub Application_Start()
        RegisterRoutes(RouteTable.Routes)
    End Sub

    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        ...
        'code here logs the unhandled exception and sends an email alert'
        ...
        Server.Transfer("http://www.example.com/error.html")
    End Sub

End Class

但是那个 Server.Transfer 失败了:

Invalid path for child request 'http://www.example.com/error.html'. A virtual path is expected.

我该如何解决?或者,我有什么更好的方法来做到这一点?

4

4 回答 4

9

我刚刚在 Scott Hanselman 的名为 ELMAH 的博客上找到了这个,一个错误记录器/处理程序,您可以使用它而无需更改代码。您可能想研究一下,因为它似乎与 MVC 很好地配合使用。

于 2009-05-01T15:57:11.030 回答
3

ELMAH是一个出色的错误处理程序,用于捕获未处理的异常。它通过 HttpModules 无缝插入到您的 Web 应用程序中,并具有各种通知和日志记录选项。

特征:

  • SQL、XML、SQLite、InMemory 日志记录
  • 电子邮件通知
  • RSS订阅
  • 详细的!记录异常
  • 易于集成
  • 错误信号 - 在为用户“死得好”的同时向错误处理程序发出信号

仅供参考,所以使用 ELMAH,尽管是分叉版本。这是最好的架构解释设置教程

于 2009-05-01T16:04:20.123 回答
2

您必须指定一个虚拟路径,即相对于应用程序库的路径(即没有应用程序外部的路径),例如: Server.Transfer("error.html") 或 Server.Transfer("/error.html ") 或 Server.Transfer("~/error.html")

于 2009-05-01T15:54:59.660 回答
2

默认情况下,ASP.NET MVC 应用程序有一个视图 Shared/Error.aspx,继承自

System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>

如果您的控制器使用属性 [HandleError],则所有异常将继续冒泡,直到被捕获,并且它们最终会出现在该页面上。

我只是添加了一个内联 Page_Load (在这种情况下有效,因为它是行尾):

<script runat="server">
  Sub Page_Load(ByVal Sender As System.Object, ByVal e As System.EventArgs)
    MyExceptionHandlerService.LogException("exceptionsource", this.Model.Exception)
  End Sub
</script>

之后,友好的“对不起……”信息。看起来 ELMAH 确实更强大,但对于我的需要,这已经足够了。

于 2009-05-01T16:20:30.397 回答