【发布时间】:2015-09-13 03:22:08
【问题描述】:
我有一个自定义过滤器,多年来我一直使用它来以更加用户友好的方式处理RequestValidationExceptions。它在所有情况下都可以正常工作直到我引入一个区域:
public class HandleHttpRequestValidationExceptionAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
//base.OnException(filterContext);
if (!(filterContext.Exception is HttpRequestValidationException))
return;
const string viewName = "~/Views/Errors/HttpRequestValidationException.cshtml";
var result = new ViewResult
{
ViewName = viewName,
ViewData = { Model = filterContext.Exception.Message }
};
//result.ViewBag.StatusCode = 200;
filterContext.Result = result;
filterContext.RouteData.Values["area"] = "";
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 200;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
filterContext.HttpContext.Server.ClearError();
}
}
...在 FilterConfig 中注册:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
filters.Add(new HandleMemberIsNotActivatedOrWaiveredAttribute());
filters.Add(new HandleMemberNotAuthorizedException());
filters.Add(new HandleHttpRequestValidationExceptionAttribute());
}
}
任何RequestValidationException 抛出的处理都没有问题(我得到了漂亮的错误页面,其中包含一些用户友好的描述发生了什么以及如何处理它)除非将一个抛出到区域中 .在这种情况下,我得到一个带有 customErrors="On" 的空白响应(如果 customErrors="Off" 则为详细的 YSOD)。如果我删除我的过滤器,那么我会得到没有详细信息的 YSOD(这也是毫无意义的)。无论哪种方式,Global.asax.cs 中的 Application_Error 都不会被触发。此外,我的所有其他自定义过滤器和全局异常处理都可以正常工作,无论异常是从哪里引发的。
如何以用户友好的方式处理RequestValidationException,无论异常来自何处(无论它是否从Area 中抛出)?
更新:即使执行filterContext.Result = new RedirectResult("/"); 也会导致相同的空白页面(单步执行表明一切正常,但没有正确响应)。
【问题讨论】:
标签: c# asp.net-mvc asp.net-mvc-5 requestvalidationmode