ASP.NET MVC 处理区域中的请求验证异常

Posted

技术标签:

【中文标题】ASP.NET MVC 处理区域中的请求验证异常【英文标题】:ASP.NET MVC handling RequestValidationException in Area 【发布时间】: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("/"); 也会导致相同的空白页面(单步执行表明一切正常,但没有正确响应)。

【问题讨论】:

【参考方案1】:

我相信您需要将该区域的错误模型转发到您的错误控制器才能生成视图。否则您将不得不将错误控制器路由到该区域。

看看这个链接。 Redirect From Action Filter Attribute

【讨论】:

它已经通过 FilterConfig 全局注册(并且在调试时,它会正确地通过它)。你是说这是处理已经非常古怪的异常的一种古怪方式吗? 不。没有按预期进行。同样,在 FilterConfig 中注册已经在全局范围内注册它。那么就不需要把它作为特定控制器的属性扔进去了。 问这个问题可能很疯狂,但是您如何将区域外的路线重定向回主视图。不会 ~/Views/Errors/HttpRequestValidationException.cshtml 在该区域中查找该视图。

以上是关于ASP.NET MVC 处理区域中的请求验证异常的主要内容,如果未能解决你的问题,请参考以下文章

使用 WIF 和 jquery ajax 请求时 ASP.NET MVC 3 中的会话 Cookie 过期处理

七天学会ASP.NET MVC ——线程问题异常处理自定义URL

ASP.Net MVC 5 Sending Email 错误:根据验证程序,远程证书无效

ASP.NET MVC中注册Global.asax的Application_Error事件处理全局异常

控制器中的异常处理 (ASP.NET MVC)

[Asp.net mvc]实体更新异常:存储区更新插入或删除语句影响到了意外的行数。实体在加载后可能被修改或删除。