从属性中抛出异常时不显示自定义错误页面

时间:2014-05-12 13:46:48

标签: asp.net-mvc asp.net-mvc-routing httpexception

让我首先描述如何设置我的错误处理,因为在ASP.NET MVC中有几种方法可以执行此操作。我已经在web.config中配置了httpErrors,在控制器库中覆盖了HandleUnknownAction,并设置了一个处理未定义任何内容的路由,这样可以正常工作(例如,当找不到任何内容时显示我的404错误页面,当某些内容消失时显示我的500错误页面代码中的错误。)

的Web.config:

  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <clear />
      <error statusCode="400" path="/error/400" responseMode="ExecuteURL" />
      <error statusCode="401" path="/error/401" responseMode="ExecuteURL" />
      <error statusCode="402" path="/error/402" responseMode="ExecuteURL" />
      <error statusCode="403" path="/error/403" responseMode="ExecuteURL" />
      <error statusCode="404" path="/error/404" responseMode="ExecuteURL" />
      <error statusCode="405" path="/error/405" responseMode="ExecuteURL" />
      <error statusCode="406" path="/error/406" responseMode="ExecuteURL" />
      <error statusCode="407" path="/error/407" responseMode="ExecuteURL" />
      <error statusCode="408" path="/error/408" responseMode="ExecuteURL" />
      <error statusCode="409" path="/error/409" responseMode="ExecuteURL" />
      <error statusCode="410" path="/error/410" responseMode="ExecuteURL" />
      <error statusCode="411" path="/error/411" responseMode="ExecuteURL" />
      <error statusCode="412" path="/error/412" responseMode="ExecuteURL" />
      <error statusCode="413" path="/error/413" responseMode="ExecuteURL" />
      <error statusCode="414" path="/error/414" responseMode="ExecuteURL" />
      <error statusCode="415" path="/error/415" responseMode="ExecuteURL" />
      <error statusCode="416" path="/error/416" responseMode="ExecuteURL" />
      <error statusCode="417" path="/error/417" responseMode="ExecuteURL" />
      <error statusCode="429" path="/error/429" responseMode="ExecuteURL" />
      <error statusCode="500" path="/error/500" responseMode="ExecuteURL" />
      <error statusCode="501" path="/error/501" responseMode="ExecuteURL" />
      <error statusCode="502" path="/error/502" responseMode="ExecuteURL" />
      <error statusCode="503" path="/error/503" responseMode="ExecuteURL" />
      <error statusCode="504" path="/error/504" responseMode="ExecuteURL" />
      <error statusCode="505" path="/error/505" responseMode="ExecuteURL" />
    </httpErrors>
  </system.webServer>

(我的自定义错误页面是一个路径为“error / {code}”的视图

控制器基础:

protected override void HandleUnknownAction(string actionName)
{
    throw new HttpException(404, null);
}

RouteConfig:

routes.MapRoute("Undefined", "{*url}", new { controller = "Undefined", action = "Index" });

UndefinedController:

public class UndefinedController : Controller
{
    public ActionResult Index()
    {
        throw new HttpException(404, null);
    }
}

我还有一个HttpErrorResult(ActionResult)类可以正常返回任何错误:

public class HttpErrorResult : ActionResult
{
    private int _code = 0;

    public HttpErrorResult(int code)
    {
        _code = code;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        throw new HttpException(_code, null);
    }
}

好的,应该是我的错误处理中涉及的所有代码。

我遇到的问题是,当我从属性返回HttpErrorResult时,它不会显示我的自定义错误页面,而是标准的黄色错误页面,说“服务器错误在'/'应用程序”“类型'系统的例外。 Web.HttpException'被抛出。“

具体来说,当我尝试在EnforceRequestLimitAttribute(AuthorizeAttribute)类中返回429错误(请求太多)时,我遇到此问题:

public override void OnAuthorization(AuthorizationContext filterContext)
{
    if (!AuthorizeCore(filterContext.HttpContext))
        filterContext.Result = new HttpErrorResult(429);
    else
        base.OnAuthorization(filterContext);
}

我无法理解这个的原因,因为在HandleUnknownAction方法和UndefinedController中抛出HttpException并在任何其他控制器中使用HttpErrorResult来获取自定义错误页面但在属性中它的行为有所不同。

为什么要这样做以及可以做些什么来解决它?

2 个答案:

答案 0 :(得分:0)

我还没弄清楚原因,但只是设置Response.StatusCode而不是返回抛出HttpException的Result会产生预期效果,即显示自定义错误页面。

filterContext.HttpContext.Response.StatusCode = 429;

答案 1 :(得分:0)

对我来说,问题出在Global.asax.cs中。当我在“调试”模式下遇到异常时,我按F10键越过该异常并查看发生了什么。原来我在做

Server.ClearError();

这阻止了“自定义错误”页面的显示。删除此行可解决此问题。