.NET Core 中是不是已弃用 ApiController
Posted
技术标签:
【中文标题】.NET Core 中是不是已弃用 ApiController【英文标题】:Is ApiController deprecated in .NET Core.NET Core 中是否已弃用 ApiController 【发布时间】:2016-12-04 16:19:37 【问题描述】:“ApiController
将在 .NET Core 中被弃用”是真的吗?因为我打算在新项目中使用它所以问。
【问题讨论】:
简短回答:是的。不是那么简短的答案:Asp.Net MVC 和 Asp.Net Web API 被合并到 asp.net-core 中的一个代码库中。所以它们都继承自Controller
,并且都可以返回IActionResult
的实现。无论是用于 MVC 的 View
还是用于 Web api 的 Json
。您可以根据需要配置核心。 docs.asp.net/en/latest/intro.html
[ApiController]
从 2.1 开始添加。见下文。
【参考方案1】:
更新 ASP.NET Core 2.1
从 ASP.NET Core 2.1 开始,一组新的类型可用于创建 Web API 控制器。您可以使用 [ApiController]
属性注释您的控制器,该属性启用了一些新功能,例如自动模型状态验证和绑定源参数推断。有关更多信息,请参阅文档:
https://docs.microsoft.com/en-us/aspnet/core/web-api/index?view=aspnetcore-2.1#annotate-class-with-apicontrollerattribute.
确实没有特定的ApiController
类,因为 MVC 和 WebAPI 已合并到 ASP.NET Core 中。但是,MVC 的 Controller
类带来了许多您在仅开发 Web API 时可能不需要的功能,例如视图和模型绑定。
如果您想要不同的东西,有两种选择:
使用Microsoft.AspNetCore.Mvc.Core 包中的ControllerBase
类。
或者
创建您的ApiController
基类。这里的关键是添加[ActionContext]
属性,它将当前ActionContext
实例注入到属性中:
[Controller]
public abstract class ApiController
[ActionContext]
public ActionContext ActionContext get; set;
另外,将[Controller]
属性添加到类中,以将其标记为用于 MVC 控制器发现的控制器。
在我的“Web API in MVC 6” blogpost 中查看更多详细信息。
【讨论】:
这实际上正是 WebApi 兼容性 Shim 包中的ApiController
所做的,它只是绑定了更多属性,但它们都基于通过属性github.com/aspnet/Mvc/blob/dev/src/… 注入的 ControlerContext,但带有更多兼容性的东西(这完全是可选),如路由注册github.com/aspnet/Mvc/blob/dev/src/… 或 WebApi2 esque 属性
此注释有助于 ControllerBase 的选择... // // 摘要: // 不支持视图的 MVC 控制器的基类。 [Controller] 公共抽象类ControllerBase
仅供参考,对于 ASP.NET Core 2.1,您的答案已经过时,请参阅 Riscie 在新 ApiControllerAttribute
上的答案。如果你能更新你的答案会很棒,因为它是被接受的:)
感谢@Stijn 的提醒。我已经更新了我的答案。
@HenkMollema:我仍然很困惑(在 ASP.Net 核心 2.1 中)为什么我们需要使用 ApiController 和 ControllerBase中的一个或两个> 表示 Web API 控制器类。为什么同一任务存在两件事,即制作 API?【参考方案2】:
[ApiController]
属性实际上是在 ASP.NET Core 2.1 版中重新添加的。
与属性相结合的特征是:
验证错误会自动触发 HTTP 400 响应。 不再需要明确定义[FromBody]
、[FromRoute]
、...属性
文档链接:
https://docs.microsoft.com/en-us/aspnet/core/aspnetcore-2.1?view=aspnetcore-2.1#apicontroller-actionresult https://docs.microsoft.com/en-us/aspnet/core/web-api/index?view=aspnetcore-2.1#annotate-class-with-apicontrollerattribute更新
还有一个基类 ControllerBase
供控制器继承,它适用于 api 控制器,因为它省略了所有与视图相关的功能。
【讨论】:
有没有资源可以比较分析ApiController和ControllerBase,即一个能做什么,另一个不能做什么或什么时候做用什么?这真是令人困惑。 @Koder101 完全同意你的看法。一堆具有几乎相同功能的东西,没有任何可以比较的好资源。 这篇文档告诉你每个item给你带来了什么好处(ApiController属性和ControllerBase继承):docs.microsoft.com/en-us/aspnet/core/web-api/…【参考方案3】:在 ASP.NET 核心中使用 ASP.NET MVC 和 ASP.NET WepAPI 中已知的术语和概念。但基本上它是一个全新的框架。因此,我们可以简单地忘记几个概念或基类。
ASP.NET MVC 和 ASP.NET WebApi 是两个共存但不同的框架,因此必须确定使用 ApiController
作为基类将控制器指定为 WebApi 控制器。
在 ASP.NET Core 中,这不再是必需的了。 Controller
基类可用于从 Razor 视图或 JSON 返回 HTML 的操作(使用输出格式化程序 XML 和其他格式也是可能的)。你甚至不需要Controller
基类。甚至可以使用“普通旧 C# 对象”作为 Controller
而无需继承。
下面是一个演示控制器的示例,即使ApiController
不存在,向客户端传递数据的结构方法也是类似的。
public class DemoController : Controller
public async Task<IActionResult> Action()
var model = await _someService.GetPreciousData();
return Ok(model);
【讨论】:
当我读到您的 Demo-Controller 是一个没有 Controller 继承的 POC,然后在您的代码中您从 Controller 继承时,我笑了 - 我确定这是一个错字:)【参考方案4】:正如其他人所提到的,ASP.NET Core 是一个全新的 webstack,它与旧的 ASP.NET MVC webstack 不兼容。这明确反映在它的名称和版本中!
ASP.NET Core 和 ASP.NET Core MVC 有 1.0.0 版本,让这种不兼容的问题非常清楚。
ASP.NET Core 将 MVC 和 WebApi 合并为一个刚刚调用的 Api。
这就是您可能一直在寻找的东西:
如果您要从以前的 ASP.NET MVC 或 ASP.NET WebApi 应用程序迁移,您可能需要导入 Microsoft.AspNetCore.Mvc.WebApiCompatShim
包,它提供了一些兼容性类型,这使得从以前的迁移更容易版本。其中包括 ApiController
类和在新的 webstack Api 中删除的某些属性。
但是,请注意,这只是为了帮助您迁移现有应用程序。当你创建一个新的应用程序时,你不应该使用这个兼容性垫片,而只是使用新的东西。
【讨论】:
请注意,Microsoft.AspNetCore.Mvc.WebApiCompatShim
仅适用于 ASP.NET Core 2.x - 它已在 3.x 中消失。以上是关于.NET Core 中是不是已弃用 ApiController的主要内容,如果未能解决你的问题,请参考以下文章
java.net.URLEncoder.encode(String) 已弃用,我应该改用啥?