Содержание
Начиная с .NET 6 в ASP.NET Core появился статический класс Results, а с версии .NET 7 — TypedResults (типизированный эквивалент Results), которые упрощают нам управление кодами состояния HTTP и формирование ответа клиенту. Эти классы удобно использовать в том числе и при разработке собственных API. Рассмотрим методы, которые предоставляют эти статические классы.
Методы классов Results и TypedResults
Accepted(), AcceptedAtRoute() |
Отправляет клиенту код статуса
Примеры |
BadRequest() |
Отправляет клиенту код статуса
Пример |
Bytes() |
Отправляет в ответ клиенту массив байтов и применяется обычно для отправки файлов |
Challenge() |
Создает объект IResult (или ChallengeHttpResult, если используется TypedResults) для которого выполняется метод ChallengeAsync(HttpContext, String, AuthenticationProperties). Поведение этого метода зависит от сервиса IAuthenticationService.
Возможные коды статуса, отправляемые методом: |
Conflict() |
Отправляет ответ с кодом статуса
Пример |
Content() |
Отправляет клиенту текст. Примеры см. здесь |
Created(), CreatedAtRoute() |
Отправляет ответ с кодом статуса
Примеры |
Forbid() |
Создает объект IResult (или ForbidHttpResult, если используется TypedResults) который выполняет метод ForbidAsync(HttpContext, String, AuthenticationProperties) .
По умолчанию при выполнении этого метода клиенту возвращается код статуса |
Json() |
Отправляет клиенту ответ в формате JSON. Примеры см. здесь |
LocalRedirect(), RedirectToRoute() |
Перенаправляет пользователя на локальный URL. В зависимости от заданных параметров метода может возвращать один из четырех статусных кодов:
Пример Пример |
NoContent() |
Отправляет ответ с кодом статуса
Пример |
NotFound() |
Отправляет ответ с кодом статуса
Пример |
Ok() |
Отправляет ответ с кодом статуса
Пример |
Problem() |
Применяет формат ProblemDetails для отправки ответа. |
Redirect() |
Перенаправляет на указанный адрес. В зависимости от заданных параметров метода может возвращать один из трех статусных кодов:
Пример использования см. здесь |
SignIn() |
Создает объект IResult (или SignInHttpResult, если используется TypedResults), для которого выполняется метод SignInAsync(HttpContext, String, AuthenticationProperties) |
SignOut() |
Создает объект IResult (или SignOutHttpResult, если используется TypedResults), для которого выполняется метод SignOutAsync(HttpContext, String, AuthenticationProperties) |
StatusCode() |
Отправляет клиенту определенный статусный код. Пример StatusCode() см. здесь |
Stream() |
Записывает в ответ поток данных. По своему действию аналогичен методу File(Stream, String, String, Nullable<DateTimeOffset>, EntityTagHeaderValue, Boolean) |
Text() |
Отправляет в ответе клиенту текстовое содержимое. Аналогичен методу Content(String, String, Encoding)Описание метода см. здесь |
Unauthorized() |
Отправляет ответ с кодом статуса
Пример |
UnprocessableEntity() |
Отправляет ответ с кодом статуса
Пример |
ValidationProblem() |
Отправляет ответ с кодом статуса
Пример |
File(), PhysicalFile(), VirtualFile() |
Отправляет клиенту файл
Пример Пример |
Пример использования классов Results и TypedResults
Рассмотрим небольшой пример, демонстрирующий работу классов Results и TypedResults. Допустим, нам необходимо на какой-то запрос пользователя ответить кодом 201 Created. Без классов Results и TypedResults мы бы это сделали, например, так:
app.MapGet("/create", (context) =>
{
context.Response.ContentType = "text/html";
context.Response.Headers["Location"] = "/crated";
context.Response.StatusCode = 201;
return Task.CompletedTask;
});
В соответствии с описанием кода 201, мы должны отправить в заголовке Location путь к созданному ресурсу тип которого определяется заголовком Content-Type, что мы и сделали в коде выше. С использованием классов Results и TypedResults это же действие можно сократить до одной строки:
app.MapGet("/create", () => Results.Created("/created",null));
Итого
Классы Results и TypedResults позволяют упростить работу с различными кодами статуса HTTP и содержат ряд методов, с помощью которых мы можем отправлять пользователю файлы, сообщать о проблемах и т.д. В следующих частях мы более подробно рассмотрим работы методов этих классов.