我已在我的应用程序中实现了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
。
在web.config中使用customErrors我需要更改什么?
答案 0 :(得分:2)
检查你的global.asax。您应该在RegisterGlobalFilters中注册自己的HandleError过滤器,而不是默认的HandleError过滤器。