Пользовательские ошибки ASP.NET MVC5 достигают 500 вместо 400, 403 или 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 для регистрации ошибок, и он показывает правильный код ошибки: Elmah log


person Rhys Stephens    schedule 20.02.2015    source источник
comment
Никогда не перенаправлять пользователей на страницы ошибок с соответствующими кодами состояния HTTP.   -  person Dai    schedule 20.02.2015
comment
Я не. Это настраиваемые страницы ошибок. Они видят только красивое сообщение.   -  person Rhys Stephens    schedule 20.02.2015
comment
Ваши system.web страницы ошибок установлены на redirect="...".   -  person Dai    schedule 20.02.2015
comment
Да, это правильно. Я делаю это согласно: stackoverflow.com/questions/25685737/ mvc5-custom-error-page и benfoster.io/blog/ aspnet-mvc-пользовательские страницы ошибок   -  person Rhys Stephens    schedule 20.02.2015
comment
Ваш ответ никак не помог ответить на мой вопрос. Могу ли я получить еще немного помощи   -  person Rhys Stephens    schedule 26.02.2015


Ответы (1)


Согласно следующему ответу, ResponseRewrite не будет работать с маршрутами MVC:

https://stackoverflow.com/a/3770265/758765

Если вы прочитаете сообщение в блоге Бенса (замечательно), то увидите, что он использует настоящие файлы для представления ответов 404 и 500, а не контроллер MVC.

person ThomasArdal    schedule 26.02.2015
comment
Спасибо за это. Это кажется довольно глупым, но метод Бена работает. - person Rhys Stephens; 05.03.2015