TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #2027 1.5K
День 1672. #ЗаметкиНаПолях
Атрибуты From… в .NET Web API. Окончание
Начало

Атрибут ApiController
Атрибут ApiController добавляется к контроллеру, когда методы действия внутри него используются для обслуживания ответов API. Он настраивает функции и поведение методов действий контроллера для работы с API, облегчая жизнь разработчику, например, выдачу ответа HTTP 400, если ModelState недействителен, или выдачу деталей проблемы при ошибках.

5. FromBody
Атрибут FromBody используется для извлечения информации из тела запроса, когда тип контента в запросе указан как application/json, application/xml и т.п. Среда выполнения ASP.NET Core делегирует ответственность за чтение тела средству форматирования ввода (по умолчанию используется формат JSON). Для XML его можно добавить следующим образом:
builder.Services.AddControllers()
.AddXmlSerializerFormatters();

Если контроллер имеет атрибут ApiController, необходимость в использовании атрибута FromBody отпадает.

FromBody можно использовать только для одного параметра действия. После того как поток запроса прочитан средством форматирования ввода, он больше не доступен для повторного чтения для привязки других параметров через FromBody. Таким образом, если в теле JSON передается более одного значения, их необходимо добавить в один класс и использовать его в качестве типа для параметра действия.

Когда FromBody применяется к параметру сложного типа, любые атрибуты источника привязки, применённые к его свойствам, игнорируются. Например, следующее действие Create указывает, что его параметр pet заполняется из тела:
public ActionResult<Pet> Create([FromBody] Pet pet)

Класс Pet указывает, что его свойство Breed заполняется из параметра строки запроса:
public class Pet
{
public string Name { get; set; };
[FromQuery]
public string Breed { get; set; };
}

Здесь:
- Атрибут FromQuery игнорируется.
- Свойство Breed не заполняется из параметра строки запроса.

Средства форматирования ввода читают только тело и не понимают атрибуты источника привязки. Если подходящее значение найдено в теле, это значение используется для заполнения свойства Breed.

6. FromServices
Атрибут FromServices не имеет ничего общего с HTTP-запросом. Вместо этого он позволяет использовать параметр метода действия для сопоставления с сервисом из контейнера внедрения зависимостей. Его цель — предоставить альтернативу внедрению через конструктор, когда вам нужен сервис только при вызове определённого метода.

Если экземпляр типа не зарегистрирован в контейнере внедрения зависимостей, приложение выдаст исключение при попытке привязать параметр. Чтобы сделать параметр необязательным, используйте один из следующих подходов:
- Сделайте параметр обнуляемым (в теле метода при обращении к параметру убедитесь, что он не null).
- Установите значение по умолчанию для параметра.

Атрибут FromServices также не требуется, если контроллер помечен атрибутом ApiController.

Источники:
-
https://www.roundthecode.com/dotnet-tutorials/fromquery-fromform-what-do-the-net-web-api-attributes-do
-
https://learn.microsoft.com/en-us/aspnet/core/mvc/models/model-binding
  • 👍 14
More from @netdeveloperdiary
  1. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
  2. Oct 9, 2026День 2809. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Окончание Начало 3.…
  3. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  4. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  5. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  6. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →