Я хочу, чтобы пользовательская страница ошибок отображалась для 500, 404 и 403. Вот что я сделал:
Включены пользовательские ошибки в web.config следующим образом:
<customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml"> <error statusCode="403" redirect="~/Views/Shared/UnauthorizedAccess.cshtml" /> <error statusCode="404" redirect="~/Views/Shared/FileNotFound.cshtml" /> </customErrors>
Зарегистрирован
HandleErrorAttribute
как глобальный фильтр действий вFilterConfig
классе следующим образом:public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CustomHandleErrorAttribute()); filters.Add(new AuthorizeAttribute()); }
Создана пользовательская страница ошибок для каждого из приведенных выше сообщений. По умолчанию один на 500 уже был доступен из коробки.
Объявлено в каждом настраиваемом представлении страницы ошибки, что модель для страницы
System.Web.Mvc.HandleErrorInfo
Для 500 это показывает пользовательскую страницу ошибки. Для других это не так.
Есть ли что-то, что мне не хватает?
Похоже, это не все, что нужно для отображения пользовательских ошибок, когда я читаю код в OnException
методе HandleErrorAttribute
класса, и он обрабатывает только 500.
Что я должен сделать, чтобы обработать другие ошибки?
источник
Ответы:
Моя текущая настройка (на MVC3, но я думаю, что она все еще применяется) зависит от наличия
ErrorController
, поэтому я использую:И контроллер содержит следующее:
И взгляды просто так, как вы их реализуете. Я склонен добавлять немного логики, чтобы показать трассировку стека и информацию об ошибках, если приложение находится в режиме отладки. Итак, Error.cshtml выглядит примерно так:
источник
redirectMode="ResponseRewrite"
наCustomerErrors
элемент//you may want to set this to 200
в коде. НЕ ДЕЛАЙ ЭТОГО!Я сделал решение Пабло, и у меня всегда была ошибка (MVC4)
Чтобы избавиться от этого, удалите строку
в FilterConfig.cs
источник
Я делаю то, что требует меньше кодирования, чем другие опубликованные решения.
Во-первых, в моем файле web.config у меня есть следующее:
И контроллер (/Controllers/ErrorPageController.cs) содержит следующее:
И, наконец, представление содержит следующее (для простоты сокращено, но оно может контактировать:
Это так просто. Это может быть легко расширено, чтобы предложить более подробную информацию об ошибках, но ELMAH обрабатывает это для меня, и statusCode & statusDescription - это все, что мне обычно нужно.
источник
Кажется, здесь есть несколько шагов, которые можно перепутать. Я выдвину то, что я сделал с нуля.
Создать
ErrorPage
контроллерДобавьте представления для этих двух действий (щелкните правой кнопкой мыши -> Добавить представление). Они должны появиться в папке с именем ErrorPage.
Внутри
App_Start
откройтеFilterConfig.cs
и закомментируйте фильтр обработки ошибок.Внутри web.config добавьте следующие
<customerErrors>
записи, подSystem.Web
Тест (конечно). Бросьте необработанное исключение в свой код и увидите, что оно идет на страницу с идентификатором 500, а затем используйте URL-адрес для несуществующей страницы, чтобы увидеть 404.
источник
An exception occurred while processing your request. Additionally, another exception occurred while executing the custom error page for the first exception. The request has been terminated.
Все, что я получил из вашего кода, находится в файле web.config, я добавил,<error redirect = "~/ControllerName/ActionName" statusCode="404"/>
и он работал нормально :) Остальная часть кода была из ответа @ Pablo. Я использую MVC 5 и Entity Framework 6. Я не удалилfilters.Add(new HandleErrorAttribute())
изFilterConfig.cs
Я бы порекомендовал использовать файл Global.asax.cs.
источник
Основываясь на ответе, опубликованном maxspan, я собрал минимальный пример проекта на GitHub показывающий все рабочие части.
По сути, мы просто добавляем
Application_Error
метод в global.asax.cs для перехвата исключения и даем нам возможность перенаправить (или, точнее, передать запрос ) на пользовательскую страницу ошибки.Контроллер ошибок:
Просмотр страницы ошибки:
Ничего другого не участвует, кроме отключения / удаления
filters.Add(new HandleErrorAttribute())
в FilterConfig.csХотя это очень просто реализовать, единственным недостатком, который я вижу в этом подходе, является использование строки запроса для доставки информации об исключении на целевую страницу ошибки.
источник
Я все настроил, но все еще не мог видеть правильные страницы ошибок для кода состояния 500 на нашем промежуточном сервере, хотя на локальных серверах разработки все работало нормально.
Я нашел этот пост от Рика Стрэла, который помог мне.
Мне нужно было добавить
Response.TrySkipIisCustomErrors = true;
в мой собственный код обработки ошибок.источник
Вот мое решение. Используйте [ExportModelStateToTempData] / [ImportModelStateFromTempData] неудобно, на мой взгляд.
~ / Просмотров / Home / Error.cshtml:
~ / Контроллеры / HomeController.sc:
~ / Контроллеры / BaseController.sc:
~ / Контроллеры / MyController.sc:
Желаю вам успешных проектов ;-)
источник
Вы можете заставить ошибки работать правильно, не взламывая global.cs, не связываясь с HandleErrorAttribute, не делая Response.TrySkipIisCustomErrors, подключая Application_Error или что-то еще:
В system.web (просто обычный, вкл / выкл)
и в system.webServer
Теперь все должно работать так, как ожидалось, и вы можете использовать свой ErrorController для отображения всего, что вам нужно.
источник
Кажется, я опоздал на вечеринку, но тебе стоит это проверить.
Так что
system.web
для кеширования исключений внутри приложения, таких как return HttpNotFound ()и
system.webServer
для обнаружения ошибок, которые были обнаружены IIS и не попали в среду asp.netВ последнем случае вы беспокоитесь о реакции клиента , то изменить ,
responseMode="Redirect"
чтобыresponseMode="File"
и служить статический HTML - файл, так как это одна будет отображать дружественную страницу с кодом 200 ответа.источник
В web.config добавьте это в тег system.webserver, как показано ниже:
и добавить контроллер как,
и добавить их уважаемые взгляды, это будет работать определенно, я думаю, для всех.
Это решение я нашел его из: Нептун В.
источник