Содержание
Для переадресации запросов в статических классах 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 в качестве адреса перенаправления принимает имя конечной точки, что, потенциально, избавляет нас от жесткого кодирования пути переадресации в коде приложения.

