2011-09-05 11 views
14

En ASP.NET cuando está en el modo DEBUG y falla algo, obtiene la famosa pantalla amarilla de la muerte.¿Hay alguna implementación en alguna parte de la pantalla amarilla de la muerte?

Muestra que hubo un Server Error in <Location> Application, proporciona una descripción, detalles de excepción, archivo fuente y seguimiento de la pila.

Me gustaría extender esta página de error para incluir algo de información adicional.

  • ¿Hay una implementación de "código abierto" de la pantalla amarilla de la muerte?
  • ¿Hay alguna manera de extender la pantalla amarilla de muerte incorporada?

Respuesta

10

El formato de la página de error se realiza mediante System.Web.ErrorFormatter y sus subclases, que por desgracia son internos. Puede tomar el HTML y modificarlo si le gusta usar HttpException.GetHtmlErrorMessage(). Pero me inclinaría a hacer lo que otros comentaristas han sugerido y usar Server.GetLastError y formatearlo yo mismo.

Si es así - por favor, que HtmlEncode garantizar la salida de mensaje de error para mitigar XSS y asegurarse de que sus sitios de producción no muestran ninguna información sobre el error (ya que éste era el vector de ataque para el ataque ASP.NET padding oracle descifrado en 2010).

+0

el problema con la solución propuesta con HttpException es que parece que no hay forma de interrumpir la HttpException, solo se puede interceptar la SqlException. .. –

+0

¿Qué tal simplemente 'new'-up una' HttpException' pasando su 'SqlException' como una' InnerException' y luego llamando a 'GetHtmlErrorMessage()'. –

+0

intenté eso ... no obtuve el formateador ... solo las opciones parecen ser DIY o un módulo http –

1

Si está utilizando páginas de error personalizadas, creo que puede obtener el último error con HttpContext.Current.Server.GetLastError(); No estoy seguro de si hay alguna página personalizada. Pero el contenido de YSOD debe estar disponible desde el contexto de la solicitud.

4

Esta página parece tener la información que está buscando.

http://www.asp.net/hosting/tutorials/processing-unhandled-exceptions-cs

Esencialmente, cuando una excepción burbujas hasta que el tiempo de ejecución de que se separe en una System.Web.HttpException (esto estaba mal. Por lo menos yo no vi este comportamiento en MVC 3).

Creo que puede ampliar esa clase y anular GetHtmlErrorMessage para devolver los datos adicionales que desee.

Actualización: Bueno, con un poco de experimentación parece que estaría equivocado. PERO hay una solución alternativa ...

Puede escribir la información de la excepción de la manera que elija y luego borrar el error y obtendrá lo que desea devolver.

Algo como esto ...

protected void Application_Error(object sender, EventArgs e) 
{ 
    var context = HttpContext.Current; 
    var error = context.Server.GetLastError(); 
    context.Response.Write(error.Message); 
    context.Response.Write("<br /><br />"); 
    context.Response.Write(error.StackTrace); 
    context.Response.Write("<br /><br />"); 
    context.Response.Write("Hello World"); 
    context.Server.ClearError(); 
} 
+0

En teoría, esto funciona, sin embargo, en mvc3 cuando se aplica a Application_Error tiene una SqlException ... no una HttpException –

+0

es su edición, sí ... llegué tan lejos ...es solo que no tengo y HttpException por lo que no puede renderizar el html para la pantalla amarilla a menos que codifique manualmente –

+0

Ver fuente y extraer le ahorrará el problema. A continuación, configure una bonita plantilla de afeitar que represente la excepción y los datos adicionales que desee de ella. –

Cuestiones relacionadas