Содержание
Для переадресации запросов в статических классах Results
и TypedResults
могут использоваться три метода: LocalRedirect()
, RedirectToRoute()
и Redirect()
. Сегодня разберемся с работой этих методов.
Метод LocalRedirect класса Results
Метод LocalRedirect осуществляет перенаправление пользователя на локальный URL в пределах приложения и имеет следующее описание
public static IResult LocalRedirect (string localUrl, bool permanent = false, bool preserveMethod = false);
localUrl
— локальный URL для перенаправления.permanent
—true
указывает, что перенаправление должно быть постоянным (код 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));
то получим исключение:
Для того, чтобы перенаправить пользователя на внешний 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
возвращают объект типа Redirect
со следующими свойствами
Accept |
true указывает на то, что использовался локальный адрес |
Permanent |
указывает, что перенаправление постоянное (true ) или временное (false ). |
Preserve |
true — перенаправление сохраняет метод начального запроса |
Url |
URL-адрес для перенаправления. |
Метод RedirectToRoute
возвращает объект класса RedirectToRouteHttpResult
со следующими свойствами:
Fragment |
фрагмент, который добавляется к адресу для переадресации |
Permanent |
указывает, что перенаправление постоянное (true ) или временное (false ). |
Preserve |
true — перенаправление сохраняет метод начального запроса |
Route |
название маршрута |
Route |
значения для параметров маршрута. |
Итого
Методы LocalRedirect
, Redirect
и RedirectToRoute
позволяют настроить переадресацию, используя различные варианты кодов состояния и, соотвественно, параметры для настройки такого перенаправления. При этом, метод RedirectToRoute
в качестве адреса перенаправления принимает имя конечной точки, что, потенциально, избавляет нас от жесткого кодирования пути переадресации в коде приложения.