我正在尝试将MVC3与Elmah联系起来。一切都很好,所有错误都被处理和记录,但我有自定义错误的用户的前端问题。我写了全局过滤器
public class ElmahHandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
base.OnException(context);
var e = context.Exception;
if (!context.ExceptionHandled // if unhandled, will be logged anyhow
|| RaiseErrorSignal(e) // prefer signaling, if possible
|| IsFiltered(context)) // filtered?
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));
}
}
我在Global.asax中注册了过滤器
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new ElmahHandleErrorAttribute());
//filters.Add(new HandleErrorAttribute());
}
但是当引发异常时,处理程序处理它但不使用来自web.config的defaultredirect路径。它在〜/ Shared / Error.cshtml中查看视图
我的webconfig
<customErrors mode="On" defaultRedirect="~/Home/NeutralError">
<error statusCode="404" redirect="~/Home/NeutralErrorNotFound" />
</customErrors>
有什么想法吗? :|
答案 0 :(得分:1)
默认情况下,HandleError
属性会在共享文件夹中查找Error
视图,但不会根据defaultRedirect
部分设置的customErrors
属性生效。您可以告诉HandleError
查找不同的视图名称,但我认为在您的情况下您想要重定向到其他一些操作。我希望这可行(未经测试),
public override void OnException(ExceptionContext context)
{
base.OnException(context);
var e = context.Exception;
if (!context.ExceptionHandled // if unhandled, will be logged anyhow
|| RaiseErrorSignal(e) // prefer signaling, if possible
|| IsFiltered(context)) // filtered?
return;
LogException(e);
// newly added
if (context.Exception is HttpException)
{
if(((HttpException)context.Exception).GetHttpCode() == 404)
context.Result = new RedirectResult("~/Home/NeutralErrorNotFound");
}
context.Result = new RedirectResult("~/Home/NeutralError");
}
答案 1 :(得分:0)
在OnException方法中设置基类的视图似乎为我解决了这个问题。
public override void OnException(ExceptionContext context)
{
base.View = "~/views/error/errorindex.cshtml"; // New code here...
base.OnException(context);
var e = context.Exception;
if (!context.ExceptionHandled // if unhandled, will be logged anyhow
|| RaiseErrorSignal(e) // prefer signaling, if possible
|| IsFiltered(context)) // filtered?
return;
LogException(e);
}