Переадресация и отправка кодов статуса и ошибок

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Существует два вида переадресации: временная и постоянная. И в зависимости от вида переадресации при ее выполнении сервер посылает браузерам один из двух кодов HTTP:

  • статусный код 301 представляет постоянную переадресацию. При данном типе переадресации предполагается, что запрашиваемый документ окончательно перемещен в другое место. После получения данного статусного кода браузер может автоматически настраивать запросы на новый ресурс, даже если старый ресурс со временем перестанет применять переадресацию. Поэтому данный способ использовать нежелательно.

  • статусный код 302 представляет временную переадресацию. При временной переадресации считается, что запрашиваемый документ временно перемещен на другую страницу.

В обоих случаях для переадресации будет использоваться объект RedirectResult, однако метод, возвращающий данный объект, будет отличаться.

Для временной переадресации применяется метод Redirect:

public RedirectResult SomeMethod()
{
    return Redirect("/Home/Index");
}

Для постоянной переадресации подобным образом используется метод RedirectPermanent:

public RedirectResult SomeMethod()
{
    return RedirectPermanent("/Home/Index");
}

При этом нам необязательно возвращать из метода объект RedirectResult. Нередко возникает ситуация, когда в зависимости от некоторых условий требуется направить пользователя по одному адресу, либо переадресовать на другой ресурс. Типичная ситуация: авторизация пользователя - если он авторизован, то ему отображается требуемая веб-страница, а если нет, то он перенаправляется на страницу для логина. Например:

public ActionResult Buy(int id)
{
    if (id > 3)
    {
        return Redirect("/Home/Index");
    }
    ViewBag.BookId = id;
    return View();
}

Если в качестве параметра будет передано число больше 3, то произойдет редирект на Home/Index. В остальных случаях пользователю будет возвращаться представление.

Еще один класс для создания переадресации - RedirectToRouteResult - позволяет выполнить более детальную настройку перенаправлений. Он возвращается двумя методами: RedirectToAction и RedirectToRoute.

Метод RedirectToRoute позволяет произвести перенаправление по определенному маршруту внутри домена:

public RedirectToRouteResult SomeMethod()
{
    return RedirectToRoute(new { controller="Home", action="Index"});
}

Метод RedirectToAction позволяет перейти к определенному действию определенного контроллера. Он также позволяет задать передаваемые параметры:

public RedirectToRouteResult SomeMethod()
{
    return RedirectToAction("Square", "Home", new { a=10,h=12});
}

Методы Redirect/RedirectToAction представлют временную переадресацию. Но они имеют свои двойники для создания постоянной переадресации: RedirectPermanent/RedirectToActionPermanent. Их действие аналогично, разница лишь в том, что они отправляют браузеру статусный код 301. Однако методы RedirectPermanent и RedirectToActionPermanent не рекомендуется использовать, а если и использовать, то с осторожностью. Так как неправильно настроенная постоянная переадресация может ухудшить позиции в поисковиках или способствовать полному выпадению сайта из поиска.

Отправка ошибок и статусных кодов

Иногда возникает необходимость отправить сообщения об ошибках при доступе к тому или иному ресурсу. Обычно, если ресурс недоступен, mvc-фреймворк автоматически отреагирует на эту ситуацию, отправив соответствующий статусный код. Но в некоторых ситуациях нам нужно более тонко реагировать на полученный запрос. Например, у нас есть контент, к которому установлены возрастные ограничения. Мы смотрим введенный возраст, и если он попадает под ограничение, мы можем выслать статусный код ошибки:

public ActionResult Check(int age)
{
    if (age < 21)
    {
        return new HttpStatusCodeResult(404);
    }
    return View();
}

Подобным образом мы можем послать браузеру любой другой статусный код.

В качестве альтернативы также можно возвращать объект HttpNotFoundResult с помощью метода HttpNotFound

public ActionResult Check(int age)
{
    if (age < 21)
    {
        return HttpNotFound();
    }
    return View();
}

И еще один класс, предназначенный для отправки статусных кодов - класс HttpUnauthorizedResult. Он извещает пользователя, что тот не имеет права доступа к ресурсу, отправляя браузеру статусный код 401:

public ActionResult Check(int age)
{
    if (age < 21)
    {
        return new HttpUnauthorizedResult();
    }
    return View();
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850