none
Ayuda con control de excepciones en ASP.NET RRS feed

  • Pregunta

  • Hola, les escribo porque necesito una consulta sobre el control de excepciones en asp.net (c#).
    El problema es que tengo el siguiente método que es el que envía el mail con los datos de la excepción:
    public void sendEmail()
        {
            SmtpClient client = new SmtpClient();
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.EnableSsl = true;
            client.Host = "smtp.gmail.com";
            client.Port = 587;
            // setup Smtp authentication
            NetworkCredential credentials = new NetworkCredential("errorhandler@email.com", "acaVaPassword");
            client.UseDefaultCredentials = false;
            client.Credentials = credentials;
            MailMessage msg = new MailMessage("errorhandler@email.com", "errorhandler@email.com");
            msg.Subject = "[errorHandler] - ASP.NET - www.paginaWeb.com";
            msg.IsBodyHtml = true;
            StringBuilder message = new StringBuilder();
            
            //CUERPO DEL MENSAJE
            Exception ex = HttpContext.Current.Server.GetLastError();
            StackTrace st = new StackTrace(ex, true);
            int frames = st.FrameCount;
            StackFrame sf = st.GetFrame(1);
            string servidor = HttpContext.Current.Request.Url.Host;
            string archivo = sf.GetFileName();
            string metodo = sf.GetMethod().Name;
            string linea = sf.GetFileLineNumber().ToString();
            string error = ex.Message;
            
            string url = HttpContext.Current.Request.Url.AbsolutePath;
            message.AppendLine("<font size=2><b>Fecha: </b>      " + DateTime.Now + "<br />");
            message.AppendLine("<b>Servidor: </b>       " + servidor + "<br />");
            message.AppendLine("<b>Archivo: </b>        " + archivo + "<br />");
            message.AppendLine("<b>Metodo: </b>      " + metodo + "<br />");
            message.AppendLine("<b>Linea: </b>      " + linea + "<br />");
            message.AppendLine("<b>Descripción el error: </b>       " + error + "<br />");
            message.AppendLine("<b>Browser: </b>        " + HttpContext.Current.Request.ServerVariables["HTTP_USER_AGENT"] + "<br />");
            message.AppendLine("<b>Direccion ip: </b>       " + HttpContext.Current.Request.UserHostAddress + "<br />");
            message.AppendLine("<b>Url: </b>        " + url + "</font><br />");
            message.AppendLine("<b>----------------------------------------------------</b>");
            message.AppendLine("<b>StackTrace: </b>       <br />" + ex.StackTrace + "<br />");
            message.AppendLine("<b>----------------------------------------------------</b>");
            
            //--------------------------------------------------------------------------
    
            msg.Body = message.ToString();
            try
            {
                client.Send(msg);
            }
            catch (Exception exept)
            {
                throw exept;
            }
        }
    Antes que nada aviso que éste método es controlado por el método OnError de cada aspx que tengo en mi aplicación web, y el método sendEmail está en la carpeta AppCode.
    El tema es que hay excepciones que no logro solucionar porque no tengo todos los datos, cómo se puede hacer para enviar TODOS los datos de la página que lanzó la excepción? Es decir, elementos de Session, elementos del Form, etc.

    Espero me puedan ayudar, muchas gracias!
    jueves, 3 de septiembre de 2009 12:32

Respuestas

  • Hola Gonzalo,

    Estaría bien capturar los errores que puedan llegarte al evento Application_Error en el archivo globa.asax, ya que piensa que ahí te llegarán aquellos errores o excepciones que no hayas capturado en tus páginas (por lo tanto, no es necesario que elimines el evento OnError de tus páginas. Puedes complementar la monitorización y el loggeo de errores añadiendo el archivo global.asax y capturando los errores en el evento Application_Error).

    En cuanto a lo de recorrer el Form y la sesión, te paso este ejemplo. Para recorrer la Cache o el ViewState o cualquier otro elemento que quieras comprobar, se hace de la misma forma:


    //recorremos los elementos del Form y guardamos los valores en un builder, por ejemplo
                StringBuilder builder = new StringBuilder();
    
                builder.Append("Form:");
                builder.Append(Environment.NewLine);
                builder.Append("====================================");
    
                string[] claves = HttpContext.Current.Request.Form.AllKeys;
    
                foreach (string clave in claves)
                {
                    //En el form vienen pares clave/valor --> la clave es el nombre del control y el valor es su valor
                    //Los guardamos en un stringuiblder.
                    builder.Append(string.Format("La clave {0} tiene el valor {1}",clave,HttpContext.Current.Request.Form[clave]));
                    builder.Append(Environment.NewLine);
                }
                builder.Append(Environment.NewLine);
                builder.Append(Environment.NewLine);
    
                builder.Append("Session:");
                builder.Append(Environment.NewLine);
                builder.Append("====================================");
    
                if (HttpContext.Current.Session!=null)
                {
                    //Ahora cogemos las claves y valores de los objetos guardados en sesion
                    foreach (string key in HttpContext.Current.Session.Keys)
                    {
                        builder.Append(string.Format("La clave de sesión {0} tiene el valor {1}", key, HttpContext.Current.Session[key]));
                        builder.Append(Environment.NewLine);
                    }
                }



    Espero que te sirva de ayuda!


    En caso de que la respuesta te sirva, porfavor, márcala como válida

    Muchas gracias y suerte!


    Javier Jiménez Roda


    MCP (Microsoft Certified Professional)
    MCTS (Microsoft Certified Technology Specialist)
    MCPD (Microsoft Certified Professional Developer)
    Blog: http://jimenezroda.wordpress.com

    jueves, 3 de septiembre de 2009 18:04

Todas las respuestas

  • Hola Gonazlo,

    bueno si ya tienes acceso al contexto (HttpContext) puedes acceder a los elementos del form --> HttpContext.Current.Request.Form["elemento"]
    Del mismo modo, tienes acceso a la session --> HttpContext.Current.Session["elemento"].

    En cualquier caso, como tambien puedes acceder por índice, puedes recorrer estas listas y recuperar el valor de cada uno de los controles.

    También podrías capturar la excepción y llamar al método SendMail desde el archivo Global.asax, en el método Application_Error.


    En caso de que la respuesta te sirva, porfavor, márcala como válida

    Muchas gracias y suerte!


    Javier Jiménez Roda


    MCP (Microsoft Certified Professional)
    MCTS (Microsoft Certified Technology Specialist)
    MCPD (Microsoft Certified Professional Developer)
    Blog: http://jimenezroda.wordpress.com

    jueves, 3 de septiembre de 2009 13:44
  • Muchas gracias por responder!, algo que quisiera saber, cómo sería para recorrer los elementos (del form y la session) y mostrar el nombre y el valor de los mismos?
    Otra cosa.. yo manejo desde el OnError de cada página aspx.. lo que tu me dices de manejarlo desde el global.asax, es algo que debo hacer además de lo del OnError, o en caso de hacer lo del global.asax, debo quitar el OnError?

    Me podrías tirar algo de código para entenderlo un poco mejor?
    Gracias.
    jueves, 3 de septiembre de 2009 13:49
  • Hola Gonzalo,

    Estaría bien capturar los errores que puedan llegarte al evento Application_Error en el archivo globa.asax, ya que piensa que ahí te llegarán aquellos errores o excepciones que no hayas capturado en tus páginas (por lo tanto, no es necesario que elimines el evento OnError de tus páginas. Puedes complementar la monitorización y el loggeo de errores añadiendo el archivo global.asax y capturando los errores en el evento Application_Error).

    En cuanto a lo de recorrer el Form y la sesión, te paso este ejemplo. Para recorrer la Cache o el ViewState o cualquier otro elemento que quieras comprobar, se hace de la misma forma:


    //recorremos los elementos del Form y guardamos los valores en un builder, por ejemplo
                StringBuilder builder = new StringBuilder();
    
                builder.Append("Form:");
                builder.Append(Environment.NewLine);
                builder.Append("====================================");
    
                string[] claves = HttpContext.Current.Request.Form.AllKeys;
    
                foreach (string clave in claves)
                {
                    //En el form vienen pares clave/valor --> la clave es el nombre del control y el valor es su valor
                    //Los guardamos en un stringuiblder.
                    builder.Append(string.Format("La clave {0} tiene el valor {1}",clave,HttpContext.Current.Request.Form[clave]));
                    builder.Append(Environment.NewLine);
                }
                builder.Append(Environment.NewLine);
                builder.Append(Environment.NewLine);
    
                builder.Append("Session:");
                builder.Append(Environment.NewLine);
                builder.Append("====================================");
    
                if (HttpContext.Current.Session!=null)
                {
                    //Ahora cogemos las claves y valores de los objetos guardados en sesion
                    foreach (string key in HttpContext.Current.Session.Keys)
                    {
                        builder.Append(string.Format("La clave de sesión {0} tiene el valor {1}", key, HttpContext.Current.Session[key]));
                        builder.Append(Environment.NewLine);
                    }
                }



    Espero que te sirva de ayuda!


    En caso de que la respuesta te sirva, porfavor, márcala como válida

    Muchas gracias y suerte!


    Javier Jiménez Roda


    MCP (Microsoft Certified Professional)
    MCTS (Microsoft Certified Technology Specialist)
    MCPD (Microsoft Certified Professional Developer)
    Blog: http://jimenezroda.wordpress.com

    jueves, 3 de septiembre de 2009 18:04
  • Muchas gracias!! Estoy seguro que me va a servir!
    jueves, 3 de septiembre de 2009 18:20