Custom error redirect page does not work with ELMAH

I registered ELMAH in my application, everything works fine, except for custom page redirection.

I added the following lines to 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 according to the controller, I also created a view for it.

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; } } 

Test Error Detection

 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: -

The error page Shared\Error.cshtml will be displayed Shared\Error.cshtml instead of Bug\ViewBug .

What do I need to change to work with customErrors in web.config?

+4
source share
1 answer

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

+2
source

All Articles