Содержание
Начиная с .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 и содержат ряд методов, с помощью которых мы можем отправлять пользователю файлы, сообщать о проблемах и т.д. В следующих частях мы более подробно рассмотрим работы методов этих классов.