KARPACH

WEB DEVELOPER BLOG

ASP.NET Global.asax error logger

You probably know that you should never show ASP.NET error message to the client. The method below should be placed in Global.asax, so it would send an error notification to the developer in case of any error. Email is going to have details of an exception, URL of the page, referer page, IP address of the client, Form and Session values, an user name of a logged user if logged in. The response will be transferred to the general error page, which not gonna have any details of an actual exception. If the error page has an error ( it happens if the masterpage has an error) then the method simply prints an error message using Response.Write.

void Application_Error(object sender, EventArgs e)
{
        // Code that runs when an unhandled error occurs
        string testEnvironment = ConfigurationSettings.AppSettings["isTestEnvironment"];
        if (testEnvironment == "0")
        {
                Exception ex = Server.GetLastError();
                if (ex is HttpException && ex.InnerException is ViewStateException)
                {
                        Response.Redirect(Request.Url.AbsoluteUri)                
                        return
                }
                StringBuilder theBody = new StringBuilder();
                theBody.Append("URL: " + Request.Url + "\n");
                theBody.Append("Referer: " + Request.ServerVariables["HTTP_REFERER"] + "\n");
                theBody.Append("IP: " + Request.ServerVariables["REMOTE_HOST"] + "\n");
                theBody.Append("Error Message: " + ex.ToString() + "\n");
                if (User.Identity.IsAuthenticated)
                        theBody.Append("User: " + User.Identity.Name + "\n");
                else
                        theBody.Append("User is not logged in." + "\n");
                theBody.Append("Form Values: " + "\n");
                foreach (string s in Request.Form.AllKeys)
                {
                        if (s != "__VIEWSTATE")
                                theBody.Append(s + ":" + Request.Form[s] + "\n");
                }
                theBody.Append("Session Values: " + "\n");
                foreach (string s in Session.Keys)
                        theBody.Append(s + ":" + Session[s] + "\n");
                System.Net.Mail.MailMessage email = new System.Net.Mail.MailMessage();
                email.IsBodyHtml = false;
                email.From = new System.Net.Mail.MailAddress("errors@karpach.com", "ErrorManager");
                email.To.Add(new System.Net.Mail.MailAddress("errornotification@karpach.com", "Developer"));
                email.Subject = Request.Url.ToString().Split('/')[2] + " has ASP.NET error";
                email.Body = theBody.ToString();
                try
                {
                        System.Net.Mail.SmtpClient emailProvider = new System.Net.Mail.SmtpClient();
                        emailProvider.Send(email);
                }
                catch (Exception anException)
                {
                }
                finally
                {
                        if (Request.Url.Segments[Request.Url.Segments.Length - 1].ToLower() != "error.aspx")
                                Response.Redirect("~/error.aspx?msg=4");
                        else
                        {
                                Response.Write(@"We encountered an internal error. We apologize for any inconvenience
                                        but know that our staff gets emailed EVERY error that occurs so that we can solve it promptly.");
                                Response.End();
                        }
                }
        }

}
Posted on March 19, 2008 by

Comments

Posted on 5/20/2011 12:53:37 AM by Puneet Malviya

Hi….,

this is nice artical……This is helpfull for me..

Posted on 7/17/2011 03:03:58 AM by Andrzej

Hi,

Nice article, very helpful, however I am getting message that sessionVariable are not accesible in global.asmx. Any ideas how to solve it?

Posted on 8/17/2011 11:39:41 AM by market

Yeaaaaa !!!.. for me too.

Thanks a lot

Posted on 1/31/2012 02:33:15 AM by khaing

I try this code and it gives me error.

‘Session state is not available in this context.’

at ‘foreach (string s in Session.Keys)’

what should i do?

You can wrap foreach statement with if statement:

if (HttpContext.Current.Session!=null) { foreach (string s in Session.Keys) ... }

Posted on 10/17/2012 10:31:54 PM by narendra

thnx, nice example…