miércoles, 16 de septiembre de 2009

Personalizar el control de errores ASPNET


Cuando hacemos una aplicacion aspnet por lo regular olvidamos manejar los errores y por lo general aparece una pantalla muy parecida a la que tienen a su mano izquierda.

Lo ideal es que no aparesca esta pantalla, manejar el error y llevar un estricto control de los mismos.

Personalización de la página de error

Para personalizar la página de error por defecto, tiene que cambiar la configuración de la aplicación en el web config.

Hay tres modos de error en el que una aplicación ASP.Net que puede trabajar:

Off Mode
On Mode
RemoteOnly Mode

El atributo de modo de error determina si o no un mensaje de error se muestra ASP.Net. De forma predeterminada, el valor de modo está Comentariado sin embargo funciona con la opcion "On Mode" y muestra la pantalla antes mencionada.

Off Mode
Cuando el atributo de error está en "Off", ASP.Net utiliza su página de error por defecto para los usuarios locales y remotos en caso de un error.

On Mode
En el caso de "On Mode" , ASP.Net definidos por el usuario utiliza la página de error personalizados en lugar de su página de error por defecto para los usuarios locales y remotos. Si una página de error personalizada no se especifica, ASP.Net muestra la página de error que describe cómo habilitar la visualización remota de errores.

RemoteOnly
ASP.Net página de error se muestra sólo a los usuarios locales. Peticiones remotas comprueba en primer lugar los ajustes de configuración de la página de error personalizado o, finalmente, mostrar un error de IIS.


Ahora que ya conocemos como funciona la teoria pasemos a la parte practica.

1.) Dirijase al web config y cambie las entradas de customErrors de tal manera que funcionar customerrors. Ejemplo.

Web.Config File
< ?xml version="1.0" encoding="utf-8" ? >
< configuration >
< system.web >
< customErrors defaultRedirect="error.htm" mode="On"/>
< /system.web >
< /configuration >

Como se muestra en el archivo de configuración, el atributo "defaultRedirect" se ha establecido por la pagina error.htm. La página de error puede ser una página web ASP.Net, esta puede ser una página ASP o una página HTML simple.

Ejemplo de la pagina que mostrara el error:
Error.htm

< html xmlns="http://www.w3.org/1999/xhtml" >
< head >
< title >< /title >
< /head >
< body >
Sentimos mucho las molestias causadas, estamos trabajando para servirle mejor...
< br >
< /body >
< /html >

Notificar al Administrador
Ya hemos mostrado una pagina mas bonita de errores ahora nos toca llenar
un control de los errores, por esa razon escribiremos entradas al Event Log del sistema operativo.

Para lograr este objetivo agregue o edite su global.asax en el evento Application_Error.
pero primero agregue unos usign en la parte superior del archivo y luego busque el evento Application_Error y agregue necesario aqui un ejemplo.

< %@ Import Namespace="System.Web" % >
< %@ Import Namespace="System.Web.SessionState" % >
< %@ Import Namespace="System.Diagnostics" % >
void Application_Error(object sender, EventArgs e)
{
string ErrorDescription = Server.GetLastError().ToString();
string EventLogName = "ErrorSample";
if ((!EventLog.SourceExists(EventLogName)))
{
EventLog.CreateEventSource(EventLogName, EventLogName);
}
EventLog Log = new EventLog();
Log.Source = EventLogName;
Log.WriteEntry(ErrorDescription, EventLogEntryType.Error);


}

En este mismo evento podria enviar un mail, ejemplo:

< %@ Import Namespace="System.Web" % >
< %@ Import Namespace="System.Web.SessionState" % >
< %@ Import Namespace="System.Web.Mail" % >


void Application_Error(object sender, EventArgs e)
{

MailMessage mail = new MailMessage();
string ErrorMessage = "The error description is as follows : " + Server.GetLastError().ToString;
mail.To = "administrator@domain.com";
mail.Subject = "Error in the Site";
mail.Priority = MailPriority.High;
mail.BodyFormat = MailFormat.Text;
mail.Body = ErrorMessage;
SmtpMail.Send(mail);

}

O puede unir ambos ejemplos, espero les sirva.

4 comentarios:

Andy00 dijo...

Execelente articulo, CJ... sos grande... seguro que ya lo implemente an mi apliacion..esto de manejar los errores se me ha vuelto mucho + manejable gracias.....

Carlos Juan dijo...

Espero te sirva, y estamos para servirte.

oz!! dijo...

Hola, buen artículo!

Yo tengo un problema. En mi web.config ya tengo eso bien configurado, tanto, que en un ambiente de producción esto corre sin problemas, y me muestra mi página de errores personalizada y recibo un correo con el problema y todo par amanejarlo.

Esta aplicación la he hecho ya hace 3 años, y actualmente, se está migrando a otro servidor windows 2003 r2 server(estaba antes en un windows 2003 server), y el manejo de errores, pese a que está igual y nada ha sido cambiado, no funciona. Me sigue desplegando la página de error que pusiste en tu post.

Alguna sugerencia??

Carlos Juan dijo...

oz: lo que te esta pasando puede ser por varias causas:

1.) antes tenias una aplicación(application) ahora solo tiene la carpeta virtual(virtual directory) y como es una carpeta virtual esta obteniendo las propiedad de herencia de sitio superior.

solucion:prueba a poner esta configuaracion en el site superior o has tu site una aplicacion.

2.)creaste un nuevo web site y lo configuraste de una manera equivocada.

solucion: configuralo bien puede ser tu sharepool o pasalo a web site default.
Una vez me paso que el chavo de redes anulo el default web site y creo el su web site y no jalaba y era por que digo ariba.


3.) tenes esta framework equivocado?

solucion: instalar el framework que es.

si no es nada de esto confirmamelo para probar otra solucion