500 Внутренняя ошибка сервера в MVC

Я пытаюсь настроить пользовательские ошибки для сайта MVC. У меня 404 страница работает нормально, но при тестировании ошибки сервера я получаю сообщение по умолчанию:

Произошла ошибка при обработке вашего запроса.

Вместо моей пользовательской страницы.

Я установил это в файле web.config:

<customErrors mode="On"  defaultRedirect="~/Error/500">
    <error statusCode="404" redirect="~/Error/404" />
    <error statusCode="500" redirect="~/Error/500" />
</customErrors>

Мой контроллер ошибок выглядит следующим образом:

public class ErrorController : Controller
{
    [ActionName("404")]
    public ActionResult NotFound()
    {
        return View();
    }

    [ActionName("500")]
    public ActionResult ServerError()
    {
        return View();
    }
}

Я тестирую страницу ошибки 500, вызывая исключение в одном из моих представлений:

[ActionName("contact-us")]
public ActionResult ContactUs()
{
    throw new DivideByZeroException();
    return View();
}

Почему так обрабатываются только 404 ошибки? Как я могу отобразить страницу ошибки для ошибок 500?

Ответ 1

Выяснил это.

При создании проекта в Global.asax.cs остался некоторый код шаблона:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
   filters.Add(new HandleErrorAttribute());
}

В частности:

filters.Add(new HandleErrorAttribute());

Это создает новый экземпляр HandleErrorAttribute, который применяется глобально ко всем моим представлениям.

Без настройки, если в представлении появляется ошибка при использовании этого атрибута, MVC отобразит файл Error.cshtml по умолчанию в папке Shared, в которую входит: "Sorry, an error occurred while processing your request.".

Из документации по HandleErrorAttribute:

По умолчанию, когда метод действия с атрибутом HandleErrorAttribute генерирует любое исключение, MVC отображает представление Error, которое находится в папке ~/Views/Shared.

Комментируя эту строку, эта проблема решена и позволила мне использовать собственные страницы ошибок для 500 ошибок.