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

StackOverflow https://stackoverflow.com/questions/811958

Вопрос

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

Но этот сервер.Передача завершается с ошибкой:

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

Как мне это исправить?Или, какой для меня лучший способ сделать это?

Это было полезно?

Решение

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

Другие советы

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

Характеристики:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top