Правда ли, что "ApiController
устареет в .NET Core"? Спрашиваю, так как я планирую использовать его в новых проектах.
Является ли ApiController устаревшим в .NET Core
Ответ 1
Обновление ASP.NET Core 2.1
Начиная с ASP.NET Core 2.1 доступен новый набор типов для создания контроллеров Web API. Вы можете аннотировать свои контроллеры с помощью атрибута [ApiController]
, который включает несколько новых функций, таких как автоматическая проверка состояния модели и вывод параметров источника привязки. Смотрите документы для получения дополнительной информации:
https://docs.microsoft.com/en-us/aspnet/core/web-api/index?view=aspnetcore-2.1#annotate-class-with-apicontrollerattribute.
Действительно, больше нет конкретного класса ApiController
, так как MVC и WebAPI были объединены в ASP.NET Core. Тем не менее, класс Controller
MVC предоставляет множество функций, которые вам, вероятно, не понадобятся при разработке только веб-API, таких как привязки видов и моделей.
У вас есть два варианта, если вы хотите что-то другое:
Используйте класс ControllerBase
в пакете Microsoft.AspNetCore.Mvc.Core.
Или
Создайте свой базовый класс ApiController
. Ключевым моментом здесь является добавление атрибута [ActionContext]
, который внедряет текущий экземпляр ActionContext
в свойство:
[Controller]
public abstract class ApiController
{
[ActionContext]
public ActionContext ActionContext { get; set; }
}
Также добавьте атрибут [Controller]
в класс, чтобы пометить его как контроллер для обнаружения контроллера MVC.
Подробности читайте в моем блоге "Web API в MVC 6".
Ответ 2
Атрибут [ApiController]
фактически был добавлен обратно в ASP.NET Core версии 2.1.
Функции, связанные с атрибутом:
- Ошибки проверки автоматически вызывают ответ HTTP 400.
- Больше нет необходимости явно определять атрибуты
[FromBody]
,[FromRoute]
,...
Ссылки на документы:
- https://docs.microsoft.com/en-us/aspnet/core/aspnetcore-2.1?view=aspnetcore-2.1#apicontroller-actionresult
- https://docs.microsoft.com/en-us/aspnet/core/web-api/index?view=aspnetcore-2.1#annotate-class-with-apicontrollerattribute
Обновление
Существует также базовый класс ControllerBase
для контроллеров, который наследуется, который подходит для API-контроллеров, потому что он пропускает все функции, связанные с представлением.
Ответ 3
В ядре ASP.NET используются термины и понятия, известные из ASP.NET MVC и ASP.NET WepAPI. Но в основном это совершенно новая структура. Поэтому есть несколько понятий или базовых классов, которые мы можем просто забыть.
ASP.NET MVC и ASP.NET WebApi - это две сосуществующие, но разные структуры, поэтому необходимо указать, какой контроллер следует использовать в качестве контроллера WebApi, используя ApiController
как базовый класс.
В ASP.NET Core это просто не нужно больше. Базовый класс Controller
может использоваться для действий, которые возвращают HTML из Razor Views или JSON (с форматами выходных форматов также возможны XML и другие форматы). Вам даже не нужен базовый класс Controller
. Можно даже использовать "Обычный объект С#" как контроллер без наследования.
Это пример демонстрационного контроллера, который показывает, что даже если ApiController не существует, структурный подход к доставке данных клиенту аналогичен.
public class DemoController : Controller
{
public async Task<IActionResult> Action()
{
var model = await _someService.GetPreciousData();
return Ok(model);
}
}
Ответ 4
Как уже упоминалось, ASP.NET Core - это совершенно новый веб-стол, который несовместим со старым веб-сайтом ASP.NET MVC. Это явно отражено в названии и версии!
ASP.NET Core и ASP.NET Core MVC имеют версию 1.0.0, чтобы сделать эту несовместимость максимально понятной.
ASP.NET Core объединил MVC и WebApi в один только что названный Api.
И вот то, что вы, возможно, искали:
Если вы переходите из предыдущего приложения ASP.NET MVC или ASP.NET WebApi, вам может понадобиться импортировать пакет Microsoft.AspNetCore.Mvc.WebApiCompatShim
, который предоставляет некоторые типы совместимости, что облегчает миграцию из предыдущего версии. Среди них класс ApiController
и некоторые атрибуты, которые были удалены в новом webstack Api.
Однако учтите, что это только для того, чтобы помочь вам в переносе существующих приложений. Когда вы создаете новое приложение, вы не должны использовать эту совместимость и просто использовать новый материал.