为什么从 ControllerBase 衍生到 ASP.NET 核心 Web API 的 Controller?

我遵循本教程来创建 ASP.NET Core Web API,在添加控制器一节中,本教程提供了代码来替换控制器的模板代码。真正吸引我眼球的事情之一是,在模板代码中,我得到:

TodoController : Controller

然后在教程代码中,我发现:

[Route("api/[controller]")]
[ApiController]
TodoController : ControllerBase

我很想知道为什么需要从 ControllerBase派生而不是从 Controller派生 Web API 控制器。为什么会这样?

38958 次浏览

why it is necessary to derive from ControllerBase instead of Controller for a Web API controller.

It is not strictly necessary, just more to the point. The Controller class derives from ControllerBase and adds some members that are only needed to support Views.

Basically:

public abstract class Controller : ControllerBase
{
public dynamic ViewBag { get; }
public virtual ViewResult View(object model) { }
// more View support stuff
}

When you write an API then ControllerBase matches your requirements better but both will work.

From the documentation (emphasis mine):

Don't create a web API controller by deriving from the Controller class. Controller derives from ControllerBase and adds support for views, so it's for handling web pages, not web API requests. There's an exception to this rule: if you plan to use the same controller for both views and web APIs, derive it from Controller.

I seem to remember that there was no ControllerBase in the first MVC iterations, it was inserted later. Hence the slightly odd naming/inheritance structure.

FROM https://learn.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-3.1

Don't create a web API controller by deriving from the Controller class. Controller derives from ControllerBase and adds support for views, so it's for handling web pages, not web API requests.

One other important difference is that ControllerBase is abstract class that's why it doesn't implement Dispose method. So you need to handle yourself. see this SO entry

ControllerBase abstract class

Controller abstract class derives from ControllerBase abstract class therefore supports to Create views ,API Not Advice to Create Views .

ControllerBase abstract class has Member[Properties,Methods] without Implementaion Like

public abstract class ControllerBase{
public HttpResponse Response { get; }
public HttpRequest Request { get; }
public HttpContext HttpContext { get; }
public virtual RedirectToActionResult RedirectToAction(string actionName);}

ControllerBase has all Request and Response between Client-side and Server-side


Controller abstract class

Controller abstract class Enables us To Create Views to display Data in client-side, it derives from ControllerBase abstract class.

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