¿Cómo registro las excepciones no controladas en ASP.NET MVC?
-
03-07-2019 - |
Pregunta
Esto es lo que estoy tratando de hacer en mi 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
Pero ese Server.Transfer falla:
Ruta no válida para la solicitud secundaria 'http://www.example.com/error.html'. Se espera una ruta virtual.
¿Cómo soluciono esto? O, ¿cuál es la mejor manera de hacer esto?
Otros consejos
ELMAH es un excelente controlador de errores para detectar excepciones no controladas. Se conecta a la perfección a su aplicación web a través de HttpModules y tiene varias opciones de notificación y registro.
Características :
- SQL, XML, SQLite, InMemory Logging
- Notificación por correo electrónico
- fuente RSS
- detallado! registro de excepciones
- Integración fácil
- Señalización de error: indica al controlador de errores un error mientras " muere bien " para el usuario
Y para tu información, SO usa ELMAH, aunque sea una versión bifurcada. Esta es la mejor explicación arquitectónica y tutorial de configuración
Tienes que especificar una ruta virtual, es decir, una ruta relativa a la base de la aplicación (es decir, no hay rutas externas a la aplicación), por lo que algo como: Server.Transfer (" error.html ") o Server.Transfer (" /error.html") o Server.Transfer (" ~ / error.html ")
De forma predeterminada, las aplicaciones MVC de ASP.NET tienen una vista Shared / Error.aspx, que se hereda de
System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>
Si su controlador utiliza el atributo [HandleError], todas las excepciones continuarán burbujeando hasta que se detecten, y terminarán en esa página.
Simplemente agregué una carga de página en línea (válida en este caso porque es el final de la línea):
<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>
Después de eso, los amigos " Lo siento ... " mensaje. Definitivamente, parece que ELMAH es más robusto, pero para mis necesidades, esto fue suficiente.