为啥从 ASP.NET Core Web API 的 ControllerBase 与 Controller 派生?

Posted

技术标签:

【中文标题】为啥从 ASP.NET Core Web API 的 ControllerBase 与 Controller 派生?【英文标题】:Why derive from ControllerBase vs Controller for ASP.NET Core Web API?为什么从 ASP.NET Core Web API 的 ControllerBase 与 Controller 派生? 【发布时间】:2019-08-09 21:14:06 【问题描述】:

我正在按照本教程创建 ASP.NET Core Web API,在添加控制器的部分中,本教程提供了用于替换控制器模板代码的代码。真正引起我注意的一件事是,在模板代码中,我得到:

TodoController : Controller

然后在我应该使用的教程代码中,我发现:

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

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

【问题讨论】:

请注意,您可以制作一个不从任何东西派生的控制器,至少它适用于.net 5+,我不知道早期版本 【参考方案1】:

为什么需要从 ControllerBase 而不是 Controller 派生 Web API 控制器。

这不是绝对必要的,只是更重要的一点。 Controller 类派生自 ControllerBase 并添加了一些仅支持视图所需的成员。

基本上:

public abstract class Controller : ControllerBase

    public dynamic ViewBag  get; 
    public virtual ViewResult View(object model)  
    // more View support stuff

当您编写 API 时,ControllerBase 会更好地满足您的要求,但两者都可以工作。

根据documentation(强调我的):

不要通过从 Controller 类派生来创建 Web API 控制器。 Controller 派生自 ControllerBase 并添加了对视图的支持,因此它用于处理网页,而不是 Web API 请求。此规则有一个例外:如果您计划对视图和 Web API 使用相同的控制器,请从 Controller 派生它

我似乎记得在第一次 MVC 迭代中没有 ControllerBase,它是后来插入的。因此有点奇怪的命名/继承结构。

【讨论】:

正如 ControllerBase 类的摘要所说:ControllerBase - “一个不支持视图的 MVC 控制器的基类。”【参考方案2】:

来自https://docs.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-3.1

不要通过从 Controller 类派生来创建 Web API 控制器。 Controller 派生自 ControllerBase 并添加了对视图的支持,因此它用于处理网页,而不是 Web API 请求。

【讨论】:

除非您对 API 请求和视图使用相同的控制器。从您的链接中:“此规则有一个例外:如果您计划对视图和 Web API 使用相同的控制器,请从 Controller 派生它。”【参考方案3】:

另一个重要的区别是 ControllerBase 是抽象类,这就是它不实现 Dispose 方法的原因。所以你需要自己处理。看到这个SO entry

【讨论】:

【参考方案4】:

ControllerBase 抽象类

Controller抽象类派生自ControllerBase抽象类,因此支持创建视图,API不建议创建视图。

ControllerBase 抽象类有 Member[Properties,Methods] 而没有 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 具有客户端和客户端之间的所有请求和响应 服务器端


控制器抽象类

控制器抽象类使我们能够创建视图来显示数据 在客户端,它派生自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

【讨论】:

Controller抽象类支持视图&& ControllerBase抽象类不支持创建视图

以上是关于为啥从 ASP.NET Core Web API 的 ControllerBase 与 Controller 派生?的主要内容,如果未能解决你的问题,请参考以下文章

将文件从 ASP.NET Core Web api 发布到另一个 ASP.NET Core Web api

如何从 ASP.NET MVC 到 ASP.NET Core Web API 的 PUT?

从 ASP.NET Web API ASP.NET Core 2 返回 HTML 并获取 http 状态 406

这是从 ASP.NET Core Web API 中的 EF Core 5 获得的啥样的响应 [关闭]

从 ASP.NET Core Web API 中的控制器访问用户身份

将 JWT 身份验证实现从 .net core 2 转移到 asp.net web api 2