ASP.NET MVC正在处理区域中的RequestValidationException



我有一个自定义过滤器,多年来我一直使用它来以更用户友好的方式处理RequestValidationException。它在所有场景中都能正常工作,直到我引入一个区域:

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("/");也会导致相同的空白页(遍历它表示一切都很好,但没有正确的响应)。

我认为您需要将区域外的错误模型转发到错误控制器,以便生成视图。否则您将不得不将错误控制器路由到该区域。

看看这个链接。从操作筛选器属性重定向

相关内容

  • 没有找到相关文章

最新更新