基本上当我的应用程序有一个未处理的异常时,我希望它被IIS记录为未处理的异常(例如,它可以在事件查看器中看到),但我还想将用户路由到错误控制器。
我已覆盖控制器的OnException
方法,以便将用户路由到自定义错误页面。问题的关键是这段代码:
protected override void OnException(ExceptionContext filterContext)
{
filterContext.Result = RedirectToAction("GeneralError", "Error", new{ routeValueA = "some value", routeValueB = "some other value"});
filterContext.ExceptionHandled = false;
}
我的问题是:如果我设置filterContext.ExceptionHandled = false
,那么我会得到一个黄色的死亡屏幕,而不是被重新路由到我的错误处理控制器。如果我设置filterContext.ExceptionHandled = true
,那么我会被重新路由,但异常不会被记录为未处理的异常。
我知道我可以使用web.config设置静态错误页面,但我不想要这样做,因为我不能动态使用路由值将数据发送到我的错误控制器。
我可以成功地将结果设置为filterContext.Result
而不标记filterContext.ExceptionHandled= true
吗?
答案 0 :(得分:2)
尝试从 this 来源
开始关注protected override void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled)
{
return;
}
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/Error.aspx"
};
filterContext.ExceptionHandled = true;
}
或者你甚至可以试试这个
在custom errors
中设置web.config
,如下所示:
<customErrors mode="On" defaultRedirect="~/Error">
<error redirect="~/Error/NotFound" statusCode="404" />
<error redirect="~/Error/UnauthorizedAccess" statusCode="403"/>
</customErrors>
您的 ErrorController :
public class ErrorController : Controller
{
public ViewResult Index()
{
return View("Error");
}
public ViewResult NotFound()
{
Response.StatusCode = 404; //you may want to set this to 200
return View("NotFound");
}
public ViewResult UnauthorizedAccess()
{
Response.StatusCode = 404; //you may want to set this to 200
return View("UnauthorizedAccess");
}
}
将HandleErrorAttribute
注册为FilterConfig
类中的全局操作过滤器,如下所示:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomHandleErrorAttribute());
filters.Add(new AuthorizeAttribute());
}
<强>更新强>
我建议您阅读 this answer ,因为它提供了您提出的问题的完整详细信息,我希望您能在那里找到一个好的解决方案!!
答案 1 :(得分:0)
我相信您要查找的是自定义错误页面,您可以在web.config文件中设置并告诉IIS重定向到自定义错误页面而不是默认页面(因为您称之为死亡的黄页:))对于任何未处理的例外情况。
这可能会有所帮助: How to make custom error pages work in ASP.NET MVC 4