4

I have implemented ELMAH logging in my application, everything is working fine, except custom page redirection.

I have added following lines in web.config

<customErrors mode="On" defaultRedirect="/Bug/ViewBug">
    <error statusCode="401" redirect="/Bug/AccessDenied"/>
    <error statusCode="403" redirect="/Bug/AccessDenied"/>
     <error statusCode="404" redirect="/Bug/PageNotFound" />
    <error statusCode="500" redirect="/Bug/InternalServerError" />
</customErrors>

following lines in Controllers\BugController.cs

public class BugController : Controller
    {
        public ActionResult ViewBug()
        {
            return View();
        }
        public ActionResult AccessDenied()
        {
            return View();
        }
        public ActionResult PageNotFound()
        {
            return View();
        }
        public ActionResult InternalServerError()
        {
            return View();
        }
    }

and as per controller I have also created view for same.

I have implemented ELMAH logging using this tutorial

HandleErrorActionInvoker.cs

 public class HandleErrorActionInvoker : ControllerActionInvoker
    {
        private readonly IExceptionFilter filter;
        public HandleErrorActionInvoker(IExceptionFilter filter)
        {
            if (filter == null)
            {
                throw new ArgumentNullException("filter");
            }
            this.filter = filter;
        }

        protected override FilterInfo GetFilters(
        ControllerContext controllerContext,
        ActionDescriptor actionDescriptor)
        {
            var filterInfo =
            base.GetFilters(controllerContext,
            actionDescriptor);
            filterInfo.ExceptionFilters.Add(this.filter);
            return filterInfo;
        }
    }

HandleErrorAttribute.cs

 public class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
    {
        public override void OnException(ExceptionContext context)
        {
            base.OnException(context);
            var e = context.Exception;
            // if unhandled, will be logged anyhow | // prefer signaling, if possible | // filtered?
            if (!context.ExceptionHandled || RaiseErrorSignal(e) || IsFiltered(context)) return;
            LogException(e);
        }
        private static bool RaiseErrorSignal(Exception e)
        {
            var context = HttpContext.Current;
            if (context == null) return false;
            var signal = ErrorSignal.FromContext(context);
            if (signal == null) return false;
            signal.Raise(e, context);
            return true;
        }
        private static bool IsFiltered(ExceptionContext context)
        {
            var config = context.HttpContext.GetSection("elmah/errorFilter") as ErrorFilterConfiguration;
            if (config == null) return false;
            var testContext = new ErrorFilterModule.AssertionHelperContext(context.Exception, HttpContext.Current);
            return config.Assertion.Test(testContext);
        }
        private static void LogException(Exception e)
        {
            var context = HttpContext.Current;
            ErrorLog.GetDefault(context).Log(new Error(e, context));
        }
    }

HandleErrorControllerFactory.cs

public class HandleErrorControllerFactory : DefaultControllerFactory
    {
        public override IController CreateController(RequestContext requestContext, string controllerName)
        {
            var controller = base.CreateController(requestContext, controllerName);
            var c = controller as Controller;
            if (c != null)
            {
                c.ActionInvoker = new HandleErrorActionInvoker(new HandleErrorAttribute());
            }
            return controller;
        }
    }

Gereating test error

public ActionResult Index()
{
    // Throw a test error so that we can see that it is handled by Elmah
    // To test go to the ~/elmah.axd page to see if the error is being logged correctly
    throw new Exception("A test exception for ELMAH");
    return View();
}

Problem:-

This will display error page Shared\Error.cshtml instead of Bug\ViewBug.

What should I have to change for working with customErrors in web.config?

rmtheis
  • 5,992
  • 12
  • 61
  • 78
imdadhusen
  • 2,493
  • 7
  • 40
  • 75
  • see: http://stackoverflow.com/questions/16700379/error-pages-not-found-throwing-elmah-error-with-custom-error-pages – solidau Feb 07 '14 at 19:30

1 Answers1

2

Check your global.asax. You should register your own HandleError filter in RegisterGlobalFilters instead of the default HandleError filter.