Tengo una página de error personalizada configurada para mi aplicación:
<customErrors mode="On" defaultRedirect="~/errors/GeneralError.aspx"
/>
En Global.asax, Application_Error (), el siguiente código funciona para obtener los detalles de la excepción:
Exception ex = Server.GetLastError();
if (ex != null)
{
if (ex.GetBaseException() != null)
ex = ex.GetBaseException();
}
Para cuando llego a mi página de error (~ / errors / GeneralError.aspx.cs), Server.GetLastError () es nulo
¿Hay alguna forma de que pueda obtener los detalles de la excepción en la página de error, en lugar de en Global.asax.cs?
ASP.NET 3.5 en Vista / IIS7
asp.net
exception
web-applications
custom-error-pages
nailitdown
fuente
fuente
Respuestas:
Mirando más de cerca la configuración de mi web.config, uno de los comentarios en esta publicación es muy útil
Entonces podemos modificar
customErrors
para agregar este parámetro:el
ResponseRewrite
modo nos permite cargar la «Página de error» sin redirigir el navegador, por lo que la URL permanece igual y, lo que es más importante para mí, la información de excepción no se pierde.fuente
UpdatePanel
s; la página de error ya no se mostrará.OK, encontré esta publicación: http://msdn.microsoft.com/en-us/library/aa479319.aspx
con este diagrama muy ilustrativo:
(fuente: microsoft.com )
En esencia, para obtener esos detalles de excepción, necesito almacenarlos yo mismo en Global.asax, para su posterior recuperación en mi página de error personalizada.
parece que la mejor manera es hacer la mayor parte del trabajo en Global.asax, con las páginas de error personalizadas manejando contenido útil en lugar de lógica.
fuente
Una combinación de lo que dijeron NailItDown y Victor. La forma preferida / más fácil es usar su Global.Asax para almacenar el error y luego redirigir a su página de error personalizada.
Global.asax :
Además, debe configurar su web.config :
Y finalmente, haga lo que necesite con la excepción que ha almacenado en su página de error :
fuente
Application[]
es un objeto global. Teóricamente, podría tener una condición de carrera en la que una segunda página sobrescribe el error. Sin embargo, dadoSession[]
que no siempre está disponible en condiciones de error, creo que esta es la mejor opción.Intente usar algo como
Server.Transfer("~/ErrorPage.aspx");
desde dentro delApplication_Error()
método de global.asax.csLuego, desde dentro
Page_Load()
de ErrorPage.aspx.cs, debería estar bien para hacer algo como:Exception exception = Server.GetLastError().GetBaseException();
Server.Transfer()
parece mantener la excepción dando vueltas.fuente
Server.Transfer
después de que una página está medio renderizada, entonces el HTML de la página a la que transfiere simplemente se concatena con lo que ya se haya renderizado. Por lo tanto, puede terminar con la mitad de una página rota seguida de la página de error debajo.Si bien aquí hay varias buenas respuestas, debo señalar que no es una buena práctica mostrar mensajes de excepción del sistema en las páginas de error (que es lo que supongo que desea hacer). Sin darse cuenta, puede revelar cosas que no desea hacer a usuarios malintencionados. Por ejemplo, los mensajes de excepción de Sql Server son muy detallados y pueden proporcionar el nombre de usuario, la contraseña y la información del esquema de la base de datos cuando se produce un error. Esa información no debe mostrarse a un usuario final.
fuente
Aquí está mi solución ...
En Global.aspx:
En Oops.aspx:
fuente
Una consideración importante que creo que todos faltan aquí es un escenario de equilibrio de carga (granja web). Dado que el servidor que está ejecutando global.asax puede ser diferente del servidor que está a punto de ejecutar la página de error personalizada, ocultar el objeto de excepción en la Aplicación no es confiable.
Todavía estoy buscando una solución confiable a este problema en la configuración de una granja web y / o una buena explicación de MS sobre por qué no puede detectar la excepción con Server.GetLastError en la página de error personalizada como puede hacerlo en global.asax Application_Error.
PD: No es seguro almacenar datos en la colección de aplicaciones sin primero bloquearlos y luego desbloquearlos.
fuente
Esto relacionado con estos 2 temas a continuación, quiero obtener GetHtmlErrorMessage y Sesión en la página de error.
La sesión es nula después de ResponseRewrite
¿Por qué HttpContext.Session es nulo cuando redirectMode = ResponseRewrite?
Intenté y veo una solución que no es necesaria
Server.Transfer() or Response.Redirect()
Primero: elimine ResponseRewrite en web.config
Web.config
Entonces Global.asax
Entonces errorHandler.aspx.cs
Para referencias
http://www.developer.com/net/asp/article.php/3299641/ServerTransfer-Vs-ResponseRedirect.htm
fuente
Funcionó para mí. en MVC 5
en
~\Global.asax
en
~\Controllers
CrearErrorController.cs
en
~\Models
CrearFunctionTools.cs
en
~\Views
Crear carpetaError
y en~\Views\Error
CrearError.cshtml
Si ingresa esta dirección
localhost/Error
Y si ocurre un error
Como puede ser en lugar de mostrar errores, la variable 'log' se almacenará en la base de datos
fuente
Creo que tienes un par de opciones aquí.
puede almacenar la última excepción en la sesión y recuperarla de su página de error personalizada; o simplemente puede redirigir a su página de error personalizada dentro del evento Application_error. Si elige este último, querrá asegurarse de utilizar el método Server.Transfer.
fuente