Пользовательская страница перенаправления ошибок не работает с ELMAH - PullRequest
4 голосов
/ 09 августа 2011

В моем приложении реализовано ведение журнала ELMAH, все работает нормально, кроме перенаправления пользовательских страниц.

Я добавил следующие строки в 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>

следующие строки в 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();
        }
    }

и в соответствии с контроллером я также создал представление для того же.

У меня реализовано ведение журнала ELMAH с использованием этого руководства

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

Ошибка определения теста

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

Проблема: -

Появится страница ошибки Shared\Error.cshtml вместо Bug\ViewBug.

Что мне нужно изменить для работы с customErrors в web.config?

1 Ответ

2 голосов
/ 21 августа 2011

Проверьте ваш global.asax.Вам следует зарегистрировать свой собственный фильтр HandleError в RegisterGlobalFilters вместо фильтра по умолчанию HandleError.

...