0

I've been scanning forums for an implementation of the Exception Management Application Block (EMAB) in an ASP.NET MVC (MVC3) application.

There's a lot of talk about ELMAH and NLog as well as handling via the global.asax (http://s151.codeinspot.com/q/694875) Vs an ErrorController (http://www.davidjuth.com/asp-net-mvc-error-handler.aspx) approach as well as leveraging the [HandleError] decoration

We are looking at standardising our Exception Management of our MVC apps with EMAB but I can't seem to find any specific examples that provide an all round solution.

Does anyone have any links or can explain exactly how you might utilise EMAB within the MVC framework

1 Answer 1

1

I decided on the approach below...

//**In Global.asax

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

        if (ExceptionPolicy.HandleException(originalError, "Global Policy", out replacedError))
        {
            Exception ex = replacedError ?? originalError;
            if (ex.InnerException != null)
            {
                ex = ex.InnerException;
            }
            var httpException = ex as HttpException;
            HttpApplication httpApplication = this.Context.ApplicationInstance;

            string message = Utility.GetFullMessage(httpApplication, ex, "::");
            string messageHtml = Utility.GetFullMessage(httpApplication, ex, "<br/>");

            LogEntry logEntry = new LogEntry();
            logEntry.EventId = 100;
            logEntry.Priority = 2;
            logEntry.Message = ex.Message + "::" + message;
            Logger.Write(logEntry);

            Response.Clear();
            Server.ClearError();

            var routeData = new RouteData();
            routeData.Values["controller"] = "Error";
            routeData.Values["action"] = Constants.ErrorGeneralKey; //"General"
            routeData.Values["message"] = ex.Message;
            routeData.Values["fullMessage"] = messageHtml;
            Response.StatusCode = 500;

            if (httpException != null)
            {
                Response.StatusCode = httpException.GetHttpCode();

                switch (Response.StatusCode)
                {
                    case 403:
                        routeData.Values["action"] = "Http403";
                        break;

                    case 404:
                        routeData.Values["action"] = "Http404";
                        break;

                    default:
                        routeData.Values["httpStatusCode"] = Response.StatusCode;
                        break;
                }
            }
            IController errorController = new ErrorController();
            var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
            errorController.Execute(rc);
        }
    }

//**In helper class

    public static string GetFullMessage(HttpApplication httpApplication, Exception ex, string delimiter)
    {
        return "StackTrace: " + ex.StackTrace
                    + delimiter + "User: " + ((httpApplication.User == null) ? "<null>" : httpApplication.User.Identity.Name)
                    + delimiter + "Data: " + GetExceptionData(ex.Data)
                    + delimiter + "Version: " + httpApplication.Request.Browser.Version
                    + delimiter + "Browser: " + httpApplication.Request.Browser.Browser
                    + delimiter + "Major Version: " + httpApplication.Request.Browser.MajorVersion.ToString()
                    + delimiter + "Minor Version: " + httpApplication.Request.Browser.MinorVersion.ToString()
                    + delimiter + "Javascript Version: " + httpApplication.Request.Browser.JScriptVersion.ToString()
                    + delimiter + "Ecma Script Version: " + httpApplication.Request.Browser.EcmaScriptVersion.ToString()
                    + delimiter + "Platform: " + httpApplication.Request.Browser.Platform
                    + delimiter + "Source: " + ex.Source
                    + delimiter + "Form: " + httpApplication.Request.Form.ToString()
                    + delimiter + "QueryString: " + httpApplication.Request.QueryString.ToString()
                    + delimiter + "TargetSite: " + ex.TargetSite;
    }

//**In Error controller

    public ActionResult General(string httpStatusCode, string message, string fullMessage)
    {
        errorViewModel.RootCause = Enums.RootCause.General;
        errorViewModel.HttpStatusCode = httpStatusCode;
        errorViewModel.Message = message;
        errorViewModel.FullMessage = fullMessage;
        return View("Error", errorViewModel);
    }

    public ActionResult Http404()
    {
        errorViewModel.RootCause = Enums.RootCause.NotFound;
        return View("Error", errorViewModel);
    }

    public ActionResult Http403()
    {
        errorViewModel.RootCause = Enums.RootCause.Forbidden;
        return View("Error", errorViewModel);
    }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.