К основному контенту

Отображение сustomErrors страниц в случае ошибок 400, 404, 500 в MVC

В одном из предыдущих постов я писал о том, как фиксировать ошибки в MVC

Сегодня я расскажу как отображать user friendly страницы, если возникли ошибки 400, 404, 500 или любые другие страницы ошибок.

Предыстория вопроса. В asp.net данный вопрос решался просто. Достаточно было в файле web.config указать секцию:

<customErrors defaultRedirect="~/500.aspx" mode="RemoteOnly">
 <error redirect="404.aspx" statusСode="404"/>
 <error redirect="500.aspx" statusСode="500"/>
</customErrors >

Либо прописать страницы для отображения ошибок в IIS.

В случае с MVC дело обстоит иначе. Так как MVC использует свою схему для маршрутизации, то для подключения страниц отображения ошибок нужно сделать следующее.

Во-первых, создадим контроллер, который будет отвечать за отображение наших ошибок пользователю.

public class ErrorController : Controller
{
 //id - код ошибки
 public ActionResult StatusCode(int id)
 {
  //Игнорируем ошибки IIS
  Response.TrySkipIisCustomErrors = true;
  //Добавляем код ошибки в Response (важно для SEO)
  switch (id)
  {
   case 403:
    Response.StatusCode = (int)HttpStatusCode.Forbidden;
    break;
   case 404:
    Response.StatusCode = (int)HttpStatusCode.NotFound;
    break;
   case 500:
    Response.StatusCode = (int)HttpStatusCode.InternalServerError;
    break;
  }
  //Возвращаем представление пользователю
  return View(id);
 }
}

Для отображения ошибок в моем случае используется одно представление. Вы можете на каждый тип ошибки возвращать представление, которое захотите.

Что же нужно сделать, чтобы перехватывать ошибки и перенаправлять на наш контроллер?
Добавить маршрут в Global.asax!

protected void Application_Error(object sender, EventArgs e)
{//Когда произошла ошибка выполнить соответствующий метод
 if (Context.IsCustomErrorEnabled)
    ShowCustomErrorPage(Server.GetLastError());
}
//Метод, который возвращает код ошибки и перенаправляет на наш контроллер
private void ShowCustomErrorPage(Exception exception)
{
 HttpException httpException = exception as HttpException ?? new HttpException(500, "Internal Server Error", exception);
 Response.Clear();
 //Создаем новый маршрут
 RouteData routeData = new RouteData();
 routeData.Values.Add("controller", "Error");
 routeData.Values.Add("fromAppErrorEvent", true);
 switch (httpException.GetHttpCode())
 {
  case 403:
   routeData.Values.Add("action", "StatusCode");
   routeData.Values.Add("Id", "403");
   break;
  case 404:
   routeData.Values.Add("action", "StatusCode");
   routeData.Values.Add("Id", "404");
   break;
  case 500:
   routeData.Values.Add("action", "StatusCode");
   routeData.Values.Add("Id", "500");
   break;
  default:
   routeData.Values.Add("action", "StatusCode");
   routeData.Values.Add("Id", "500");
   routeData.Values.Add("httpStatusCode", httpException.GetHttpCode());
   break;
 }
 Server.ClearError();
 IController controller = new ErrorController();
 controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}

Последний штрих: написать в web.config     <customErrors mode="Off"/>

Комментарии

Отправить комментарий

Популярные сообщения из этого блога

Пример взаимодействия с Odnoklassniki Rest API на C#.

Итак, как и обещал, продолжаю тему взаимодействия с различными API. В прошлый раз писал про  API ВКонтакте , сегодня напишу про API Одноклассников. Первое, что нам нужно сделать - это зарегистрироваться как разработчик на Одноклассниках. Сделать это можно по следующей ссылке  Форма регистрации разработчика приложений Получив права разработчика, необходимо зарегистрировать сайт как приложение. Подробно как это сделать можно прочитать  здесь После того как сайт будет зарегистрирован придет письмо, содержащее: Application ID: xxxxxx. Публичный ключ приложения: xxxxxxxxxxxxxxxxxxxxxxxxx. Секретный ключ приложения:  xxxxxxxxxxxxxxxxxxxxxxxxx. Ссылка на приложение: http://www.odnoklassniki.ru/games/xxxxx Используя эти данные можно начать работу с API. Для выполнения запросов к API пользователь должен авторизоваться в Одноклассниках. Добавляем на нашем сайте ссылку для авторизации пользователя: http://www.odnoklassniki.ru/oauth/authorize?client_id={0}&scope={1}&

C# и API ВКонтакте. Обращение к адресу API-сервиса путем создания HTTP-запроса (POST)

В статье  C# POST. Отправляем запросы на адрес стороннего сервера  я рассказал про метод, с помощью которого можно работать с различным API, принимающими POST запрос и возвращающими ответ в виде json или xml. Сегодня я хочу написать, как я применял этот метод при работе с API  ВКонтакте. Для примера возьму задачу получения через API списка групп, в которых состоит пользователь. В первую очередь необходимо зарегистристрировать наш сайт как приложение ВКонтакте. Заходим по ссылке  http://vk.com/editapp?act=create&site=1  и подключаем наш сайт. Дальше задача  делится на две подзадачи, а именно: авторизация пользователя и обращение к API для получения списка групп. Для авторизации мы пользователю предлагаем перейти по следующей ссылке: http://api.vkontakte.ru/oauth/authorize? response_type=code&redirect_uri={0} &client_id={1} &scope={2} &display=page , redirect_uri - адрес страницы нашего сайта, куда будет возвращен пользователь после авторизации Вконтак

IIS (Internet Information Services) и applicationHost.config. Изменение доменных привязок.

Сегодня затронем тему настроек IIS (Internet Information Services). Речь пойдет о версии IIS 7.0 (7.5). Допустим у вас есть  большое количество поддоменов, которые нужно привязать к сайту или быстро исправить на уже существующих привязках IP адрес. Стандартный интерфейс IIS позволяет редактировать привязки по одной, что в нашем случае не очень-то удобно. См. картинку Чтобы ускорить процесс, нужно вспомнить, что все доменные привязки (и не только, а и другие настройки) хранятся в конфигурационном файле applicationHost.config. Данный файл находится по адресу C:\Windows\System32\inetsrv\config\ В файле отредактировать привязки можно очень быстро.