Как мне регистрировать необработанные исключения в ASP.NET MVC? - PullRequest
7 голосов
/ 01 мая 2009

Вот что я пытаюсь сделать в моем 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 ]

9 голосов
/ 01 мая 2009

Я только что нашел это в блоге Скотта Хансельмана здесь с именем ELMAH , который является Регистратором / Обработчиком ошибок, который вы можете использовать, не меняя код. Возможно, вы захотите разобраться в этом, поскольку, похоже, он хорошо работает с MVC.

3 голосов
/ 01 мая 2009

ELMAH - отличный обработчик ошибок для перехвата необработанных исключений. Он легко подключается к вашему веб-приложению через HttpModules и имеет различные опции для уведомлений и регистрации.

Особенности:

  • SQL, XML, SQLite, InMemory Logging
  • Уведомление по электронной почте
  • RSS лента
  • Подробная! регистрация исключений
  • Простая интеграция
  • Error Signaling - сигнализирует обработчику ошибок об ошибке, пока "умирает красиво" для пользователя

И, к вашему сведению, ТАК использует ELMAH, хотя и раздвоенную версию. Это лучшее архитектурное объяснение и руководство по установке

2 голосов
/ 01 мая 2009

По умолчанию приложения 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 более устойчив, но для моих нужд этого было достаточно.

2 голосов
/ 01 мая 2009

Вы должны указать виртуальный путь, то есть путь относительно базы приложения (т.е. никаких путей, внешних по отношению к приложению), поэтому что-то вроде: Server.Transfer ( "error.html") или же Server.Transfer ( "/ error.html") или же Server.Transfer ( "~ / error.html")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...