为啥从 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 获得的啥样的响应 [关闭]