Showing posts with label Error Handling. Show all posts
Showing posts with label Error Handling. Show all posts

Saturday, October 14, 2017

Error Handling in ASP.NET

In Global.asax:


void Application_Error(object sender, EventArgs e)
        {
            Exception exc = Server.GetLastError();

            if (exc is HttpUnhandledException)
            {
                if (ConfigurationManager.AppSettings["logErrorsInDb"] == "true")
                {
                    try
                    {
                        string UserId = "n/a";
                        if (Session["usernameEmail"] != null)
                        {
                            UserId = Session["usernameEmail"].ToString();
                        }

                        string Webpage = Request.PhysicalPath;

                        // get IP **********************************
                        string IP = "n/a";
                        System.Web.HttpContext context = System.Web.HttpContext.Current;
                        string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

                        if (!string.IsNullOrEmpty(ipAddress))
                        {
                            string[] addresses = ipAddress.Split(',');
                            if (addresses.Length != 0)
                            {
                                IP = addresses[0];
                            }
                        }
                        else
                        {
                            IP = context.Request.ServerVariables["REMOTE_ADDR"];
                        }
                        // *******************************************

                        Persist persist = new Persist();
                        persist.logError(exc.InnerException.Message, UserId, exc.InnerException.StackTrace, Webpage, IP);
                    }
                    catch (Exception ex)
                    {


                    }
                }
                // Pass the error on to the error page.
                Server.Transfer("Oops.aspx?handler=Application_Error%20-%20Global.asax", true);
            }













My simple error logger:

public void logError(String Message, String UserId, String StackTrace, String Webpage, String IP)
        {
            using (SqlConnection cn = new SqlConnection(DBConnection.getDBConnection()))
            {
                int rowsAffected = 0;

                String sql = @"INSERT INTO [dbo].[ErrorLog](Message,UserId,StackTrace,Webpage,IP)
VALUES(@Message,@UserId,@StackTrace,@Webpage,@IP)";
             
SqlCommand cmd = new SqlCommand(sql, cn);
                cmd.CommandType = System.Data.CommandType.Text;
                if (Message.Length > 1000)
                {
                    Message = Message.Substring(0, 999);
                }
             
cmd.Parameters.AddWithValue("@Message", Message);
                cmd.Parameters.AddWithValue("@UserId", UserId);
                if (StackTrace.Length > 3000)
                {
                    StackTrace = StackTrace.Substring(0, 2999);
                }
             
cmd.Parameters.AddWithValue("@StackTrace", StackTrace);
                if (Webpage.Length > 500)
                {
                    Webpage = Webpage.Substring(0, 499);
                }
             
cmd.Parameters.AddWithValue("@Webpage", Webpage);
                cmd.Parameters.AddWithValue("@IP", IP);

                try
                {
                    cn.Open();
                    rowsAffected = cmd.ExecuteNonQuery();
                }
                catch (Exception err)
                {
}
            }
        }






















DDL for table:


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[ErrorLog](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Message] [nvarchar](1000) NULL,
[Timestamp] [datetime] NULL DEFAULT (getdate()),
[UserId] [nvarchar](50) NULL,
[StackTrace] [nvarchar](max) NULL,
[Webpage] [nvarchar](500) NULL,
[IP] [nvarchar](50) NULL,
 CONSTRAINT [PK_ErrorLog] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

Thursday, July 2, 2015

Exception Handling not working on Server

This is important stuff. Nothing sucks worse than when Exception Handling actually breaks your application.  And nothing sucks worse than when something behaves one way locally and a different way once it gets deployed to your server.

As this article explains, you can have a global error handler in your Global.asax file that gets fired on your local machine, but if your web.config file is lacking a CustomErrors setting, it won't work on an IIS server.

So be sure your web.config has this section:

<customErrors mode="On|Off|RemoteOnly" />

and for starters, set it to:

<customErrors mode="Off" />