Статические классы Results и TypedResults в ASP.NET Core. Переадресация

Для переадресации запросов в статических классах Results и TypedResults могут использоваться три метода: LocalRedirect()RedirectToRoute() и Redirect(). Сегодня разберемся с работой этих методов.

Метод LocalRedirect класса Results

Метод LocalRedirect осуществляет перенаправление пользователя на локальный URL в пределах приложения и имеет следующее описание

public static IResult LocalRedirect (string localUrl, bool permanent = false, bool preserveMethod = false);
  • localUrl — локальный URL для перенаправления.
  • permanenttrue указывает, что перенаправление должно быть постоянным (код 301), а false — временным (код 302).
  • preserveMethod — если равен true, то сохраняется оригинальный метод HTTP-запроса.

Посмотрим на работу этого метода с различными наборами параметров:

app.MapGet("/", () => "Root");
app.MapGet("/old", () => Results.LocalRedirect("/new"));
app.MapGet("/new", () => "NEW ADDRESS");

здесь мы указываем только первый параметр метода. И при попытке перейти по пути /old получим следующий ответ сервера:

сделаем перенаправление постоянным:

app.MapGet("/", () => "Root");
app.MapGet("/old", () => Results.LocalRedirect("/new", true));
app.MapGet("/new", () => "NEW ADDRESS");

сохраним оригинальный метод запроса:

app.MapGet("/", () => "Root");
app.MapGet("/old", () => Results.LocalRedirect("/new", true, true));
app.MapGet("/new", () => "NEW ADDRESS");

и, наконец, четвертый вариант — делаем временное перенаправление с сохранением оригинального метода:

app.MapGet("/", () => "Root");
app.MapGet("/old", () => Results.LocalRedirect("/new", false, true));
app.MapGet("/new", () => "NEW ADDRESS");

Таким образом, в зависимости от заданных параметров, метод LocalRedirect может возвращать четыре кода состояния HTTP: 301, 302, 307 и 308. При этом, если мы попробуем перенаправить пользователя на внешний URL, например, так:

app.MapGet("/old", () => Results.LocalRedirect("http://yandex.ru", false, true));

то получим исключение:

System.InvalidOperationException: The supplied URL is not local. A URL with an absolute path is considered local if it does not have a host/authority part. URLs using virtual paths (‘~/’) are also local.

Для того, чтобы перенаправить пользователя на внешний URL предназначен следующий метод.

Метод Redirect класса Results

Метод Redirect также перенаправляет пользователя на заданный URL и принимает точно такие же параметры, как и LocalRedirect, но только URL может быть в том числе и внешним. Например,

app.MapGet("/old", () => Results.Redirect("http://yandex.ru", false, true));

Перенаправить пользователя на Яндекс и вернет код 307.

Метод RedirectToRoute класса Results

Этот метод перенаправляет пользователя на заданный маршрут и содержит следующие параметры:

public static IResult RedirectToRoute (string? routeName = default, object? routeValues = default, bool permanent = false, bool preserveMethod = false, string? fragment = default);
  • routeName название маршрута
  • routeValues — значения для параметров маршрута
  • permanent — указывает, будет ли переадресация постоянной (код 301) или временной (код 302).
  • preserveMethod — если равен true, то сохраняется оригинальный метод HTTP-запроса.
  • fragment — фрагмент, который добавляется к адресу для переадресации

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

Именованные конечные точки

В ASP.NET Core конечные точки могут быть именованными. Имя для конечной точки может быть задано с использованием метода расширения WithName() следующим образом:

app.MapGet("/new", () => "NEW ADDRESS").WithName("redirect");

здесь мы создали конечную точку с именем «redirect». Для чего используются имена конечных точек? Один из вариантов — это то, что имя конечной точки может использоваться для генерации ссылок в приложении вместо жесткого кодирования пути, например, так:

app.MapGet("/", (LinkGenerator linker) => 
{
    return Results.Content($"Go to <a href={linker.GetPathByName("redirect")}>new address</a>", "text/html");
});
app.MapGet("/new", () => "NEW ADDRESS").WithName("redirect");

Теперь на главной странице приложения мы покажем ссылку на страницу /new используя имя конечной точки. Это, как минимум, позволяет нам без проблем, в любой момент поменять путь маршрута, например, с /new на /next не меняя при этом ничего в методе MapGet где формируется ссылка.

Именно это имя конечной точки и запрашивает метод RedirectToRoute в классе Results

Примеры использования метода RedirectToRoute

Теперь, когда мы создали свой именованный маршрут, можно рассмотреть такой пример:

app.MapGet("/old", () => Results.RedirectToRoute("redirect", null, false, true, "from_old"));
app.MapGet("/new", () => "NEW ADDRESS").WithName("redirect");

В результате получим следующий ответ сервера:

Методы LocalRedirect, Redirect и RedirectToRoute в классе TypedResults

Методы LocalRedirect, Redirect и RedirectToRoute в классе TypedResults выполняют те же самые операции, что и в классе Results и, при этом, возвращают следующие типизированные результаты:

методы LocalRedirect и Redirect возвращают объект типа RedirectHttpResult со следующими свойствами

AcceptLocalUrlOnly true указывает на то, что использовался локальный адрес
Permanent указывает, что перенаправление постоянное (true) или временное (false).
PreserveMethod true — перенаправление сохраняет метод начального запроса
Url URL-адрес для перенаправления.

Метод RedirectToRoute возвращает объект класса RedirectToRouteHttpResult со следующими свойствами:

Fragment фрагмент, который добавляется к адресу для переадресации
Permanent указывает, что перенаправление постоянное (true) или временное (false).
PreserveMethod true — перенаправление сохраняет метод начального запроса
RouteName название маршрута
RouteValues значения для параметров маршрута.

Итого

Методы LocalRedirect, Redirect и RedirectToRoute позволяют настроить переадресацию, используя различные варианты кодов состояния и, соотвественно, параметры для настройки такого перенаправления. При этом, метод RedirectToRoute в качестве адреса перенаправления принимает имя конечной точки, что, потенциально, избавляет нас от жесткого кодирования пути переадресации в коде приложения.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии