В моем приложении реализовано ведение журнала 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?