In https://learn.microsoft.com/en-us/aspnet/core[ASP.NET Core], controllers usually inherit either from https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.controllerbase[`ControllerBase`] or https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.controller[`Controller`]. If a controller does not use any View-specific functionality, it is recommended to inherit from `ControllerBase`. == Why is this an issue? The `ControllerBase` class contains all the necessary functionality to handle https://en.wikipedia.org/wiki/Web_API[API] requests and responses. The `Controller` class inherits from `ControllerBase` and adds support for https://learn.microsoft.com/en-us/aspnet/core/mvc/views/overview[Views], https://learn.microsoft.com/en-us/aspnet/core/mvc/views/partial[PartialViews] and https://learn.microsoft.com/en-us/aspnet/core/mvc/views/view-components[ViewComponents]. Inheriting from `Controller` when not using any View-specific functionality exposes unnecessary methods and can lead to confusion about the intention of the class. Furthermore, inheriting from `Controller` may come with a performance cost. Even though the controller might only deal with API operations, the support for Views might introduce some overhead from the MVC framework during the https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware[request processing pipeline]. An issue is raised when: * The class is marked with the https://learn.microsoft.com/en-us/aspnet/core/web-api#apicontroller-attribute[`++[ApiController]++`] attribute. * The class inherits _directly_ from `Controller`. * No View-specific functionality is used in the class. === Exceptions * If a class is marked with the https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.noncontrollerattribute[`++[NonController]++`] attribute. * If a class does not have https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/public[public] accessibility. == How to fix it Change the base type of the controller from `Controller` to `ControllerBase`. === Code examples ==== Noncompliant code example [source,csharp,diff-id=1,diff-type=noncompliant] ---- [ApiController] public class MyController : Controller // Noncompliant: Inherit from ControllerBase instead of Controller. // ^^^^^^^^^^ { // .. } ---- ==== Compliant solution [source,csharp,diff-id=1,diff-type=compliant] ---- [ApiController] public class MyController : ControllerBase { // .. } ---- == Resources === Documentation * Wikipedia - https://en.wikipedia.org/wiki/Web_API[Web API] * Microsoft Learn - https://learn.microsoft.com/en-us/aspnet/core[ASP.NET Core] * Microsoft Learn - https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.controller[Controller Class] * Microsoft Learn - https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.controllerbase[ControllerBase Class] * Microsoft Learn - https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.apicontrollerattribute[ApiControllerAttribute Class] * Microsoft Learn - https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.noncontrollerattribute[NonControllerAttribute Class] * Microsoft Learn - https://learn.microsoft.com/en-us/aspnet/core/mvc/views/overview[Views in ASP.NET Core MVC] * Microsoft Learn - https://learn.microsoft.com/en-us/aspnet/core/mvc/views/partial[Partial Views in ASP.NET Core MVC] * Microsoft Learn - https://learn.microsoft.com/en-us/aspnet/core/mvc/views/view-components[View Components in ASP.NET Core MVC] * Microsoft Learn - https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware[ASP.NET Core Middleware] ifdef::env-github,rspecator-view[] ''' == Implementation Specification (visible only on this page) === Message * Inherit from ControllerBase instead of Controller. === Highlighting The `Controller` base type of the class declaration. ''' == Comments And Links (visible only on this page) endif::env-github,rspecator-view[]