我正在学习这个创建ASP.NET Core Web API的教程,在添加控制器的部分,教程给出了替换控制器模板代码的代码。真正吸引我眼球的是,在模板代码中,我得到了:
TodoController : Controller
然后在教程代码中,我应该使用,而不是,我发现:
[Route("api/[controller]")]
[ApiController]
TodoController : ControllerBase
我很想知道为什么Web API控制器必须从ControllerBase
而不是Controller
派生。
5条答案
按热度按时间zte4gxcn1#
为什么Web API控制器必须从
ControllerBase
而不是Controller
派生。这并不是绝对必要的,
Controller
类派生自ControllerBase
,并添加了一些仅支持视图所需的成员。基本上:
当您编写API时,ControllerBase会更好地满足您的需求,但两者都可以工作。
从the documentation(强调我的):
不要通过从Controller类派生来创建Web API控制器。Controller派生自ControllerBase并添加了对视图的支持,因此它用于处理网页,而不是Web API请求。此规则有一个例外:* * 如果您计划对视图和Web API使用相同的控制器,请从Controller**派生它。
我似乎记得在第一次MVC迭代中没有ControllerBase,它是后来插入的,因此命名/继承结构有点奇怪。
6kkfgxo02#
自https://learn.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-3.1
不要通过从Controller类派生来创建web API控制器。Controller派生自ControllerBase并添加了对视图的支持,因此它是用于处理网页的,而不是web API请求。
8gsdolmq3#
ControllerBase抽象类
Controller抽象类派生自ControllerBase抽象类,因此支持创建视图,API不建议创建视图。
ControllerBase具有客户端和服务器端之间的所有请求和响应
控制器抽象类
Controller抽象类使我们能够创建视图以在客户端显示数据,它派生自ControllerBase抽象类。
https://newbedev.com/why-derive-from-controllerbase-vs-controller-for-asp-net-core-web-api
kxkpmulp4#
另一个重要的区别是ControllerBase是抽象类,这就是为什么它没有实现Dispose方法。所以你需要自己处理。参见SO entry
r1zk6ea15#
当你把一个控制器改变为一个控制器基时,下面的索引方法抛出一个错误“编译器错误CS0103”,名称'identifier'在当前上下文中不存在,