Why derive from ControllerBase vs Controller for ASP.NET Core Web API?

30,825

Solution 1

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.

Per 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.

Solution 2

FROM https://docs.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.

Share:
30,825

Related videos on Youtube

ProfK
Author by

ProfK

I am a software developer in Johannesburg, South Africa. I specialise in C# and ASP.NET, with SQL Server. I have, in some way or another, been involved in software development for about eighteen years, but always learning something new. At the moment that is WPF and MVVM.

Updated on February 15, 2022

Comments

  • ProfK
    ProfK about 2 years

    I am following this tutorial for creating an ASP.NET Core Web API, and in the section on adding a controller, the tutorial gives code to replace the template code for a controller. One of the things that really caught my eye was that in the template code, I get:

    TodoController : Controller
    

    Then in the tutorial code I'm supposed to use instead of that, I find:

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

    I'm very interested to know why it is necessary to derive from ControllerBase instead of Controller for a Web API controller. Why is this done?

    • Mark Adamson
      Mark Adamson about 2 years
      Note that you can make a controller that doesn't derive from anything, at least it works in .net 5+, I don't know about earlier versions
  • Márk Gergely Dolinka
    Márk Gergely Dolinka over 4 years
    As the ControllerBase class' summary puts it: ControllerBase - "A base class for an MVC controller without view support."
  • hacker
    hacker over 3 years
    Unless you're using the same controller for both API requests and Views. From your link: "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."
  • Ragab Mohamad
    Ragab Mohamad over 2 years
    Controller abstract class supports views && ControllerBase abstract class Not Supports To Create Views