ASP.NET MVC5 自定义错误达到 500 而不是 400、403 或 404

ASP.NET MVC5 Custom Errors hitting 500 instead of 400, 403 or 404

我已经为我的网站设置了自定义错误,如下所示 Web.config:

<system.web>
    <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/Error400">
      <error statusCode="400" redirect="~/Error/Error404"/>
      <error statusCode="404" redirect="~/Error/Error404" />
      <error statusCode="403" redirect="~/Error/Error403" />
      <error statusCode="500" redirect="~/Error/Error500" />
    </customErrors>   
</system.web>

还有

<system.webServer>  
    <httpErrors errorMode="Custom" existingResponse="Replace">
        <remove statusCode="400" />
        <error statusCode="400" path="/Error/Error400" responseMode="ExecuteURL" />
        <remove statusCode="403" />
        <error statusCode="403" path="/Error/Error403" responseMode="ExecuteURL" />
        <remove statusCode="404" />
        <error statusCode="404" path="/Error/Error404" responseMode="ExecuteURL" />      
        <remove statusCode="500" />
        <error statusCode="500" path="/Error/Error500" responseMode="ExecuteURL" />
    </httpErrors>
</system.webServer>

我从我的控制器中抛出这样的错误:

throw new HttpException((int)HttpStatusCode.BadRequest, "The checklist Id is not specified. EntityId: " + this.LoggedInEntity.EntityId + "; userId: " + this.LoggedInUser.UserId);

处理自定义错误页面请求的错误控制器是:

public class ErrorController : Controller
{
    public ActionResult Error400()
    {
        ErrorViewModel error = new ErrorViewModel();
        Response.StatusCode = (int)HttpStatusCode.BadRequest;
        return View(error);
    }

    public ActionResult Error403()
    {
        ErrorViewModel error = new ErrorViewModel();
        Response.StatusCode = (int)HttpStatusCode.Forbidden;
        return View(error);
    }

    public ActionResult Error404()
    {
        ErrorViewModel error = new ErrorViewModel();
        Response.StatusCode = (int)HttpStatusCode.NotFound;
        return View(error);
    }

    public ActionResult Error500()
    {
        ErrorViewModel error = new ErrorViewModel();
        Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        return View(error);
    }
}

但是,在抛出异常(即 400 错误)的示例中,不会调用 400 操作。相反,调用 500 操作。我怎样才能让它调用正确的 400 操作来代替抛出的错误?

我正在使用 ELMAH 记录错误,它显示了正确的错误代码:

根据以下答案,ResponseRewrite 不适用于 MVC 路由:

如果您阅读 Bens(很棒的)博客 post,他会使用实际文件来表示 404 和 500 响应,而不是 MVC 控制器。