Estoy siguiendo este tutorial para crear una API web de ASP.NET Core, y en la sección sobre cómo agregar un controlador, el tutorial brinda un código para reemplazar el código de plantilla para un controlador. Una de las cosas que realmente me llamó la atención fue que en el código de la plantilla obtengo:
TodoController : ControllerLuego, en el código del tutorial que se supone que debo usar en lugar de eso, encuentro:
[Route("api/[controller]")] [ApiController] TodoController : ControllerBase Estoy muy interesado en saber por qué es necesario derivar de ControllerBase en lugar de Controller para un controlador de API web. ¿Por qué se hace esto?
por qué es necesario derivar de
ControllerBaseen lugar deControllerpara un controlador API web.
No es estrictamente necesario, sólo más al grano. La clase Controller se deriva de ControllerBase y agrega algunos miembros que solo son necesarios para admitir Vistas.
Básicamente:
public abstract class Controller : ControllerBase { public dynamic ViewBag { get; } public virtual ViewResult View(object model) { } // more View support stuff }Cuando escribe una API, ControllerBase se adapta mejor a sus requisitos, pero ambos funcionarán.
Según la documentación (énfasis mío):
No cree un controlador de API web derivando de la clase Controller. Controller se deriva de ControllerBase y agrega soporte para vistas, por lo que es para manejar páginas web, no solicitudes de API web. Hay una excepción a esta regla: si planea usar el mismo controlador para las vistas y las API web, derivelo de Controller .
Me parece recordar que no había ControllerBase en las primeras iteraciones de MVC, se insertó más tarde. De ahí la estructura de herencia/nomenclatura ligeramente extraña.
Otra diferencia importante es que ControllerBase es una clase abstracta, por eso no implementa el método Dispose. Así que tienes que manejarte. ver esta entrada SO
DESDE https://docs.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-3.1
No cree un controlador de API web derivando de la clase Controller. Controller se deriva de ControllerBase y agrega soporte para vistas, por lo que es para manejar páginas web, no solicitudes de API web.
La clase abstracta del controlador se deriva de la clase abstracta ControllerBase, por lo tanto, es compatible con la creación de vistas, la API no es un consejo para crear vistas.
La clase abstracta ControllerBase tiene miembros [Propiedades, métodos] sin implementación como
public abstract class ControllerBase{ public HttpResponse Response { get; } public HttpRequest Request { get; } public HttpContext HttpContext { get; } public virtual RedirectToActionResult RedirectToAction(string actionName);}ControllerBase tiene todas las solicitudes y respuestas entre el lado del cliente y el lado del servidor
La clase abstracta del controlador nos permite crear vistas para mostrar datos en el lado del cliente, se deriva de la clase abstracta ControllerBase.
public abstract class Controller : ControllerBase{ public dynamic ViewBag { get; } public ViewDataDictionary ViewData { get; set; } public ITempDataDictionary TempData { get; set; } }https://newbedev.com/why-derive-from-controllerbase-vs-controller-for-asp-net-core-web-api