.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 中)为什么我们需要使用 ApiControllerControllerBase中的一个或两个> 表示 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 控制器,因为它省略了所有与视图相关的功能。

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.controllerbase?view=aspnetcore-2.1

【讨论】:

有没有资源可以比较分析ApiControllerControllerBase,即一个能做什么,另一个不能做什么或什么时候做用什么?这真是令人困惑。 @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的主要内容,如果未能解决你的问题,请参考以下文章

PHP 已弃用:each() 函数已弃用 [重复]

DTD 是不是已弃用?

java.net.URLEncoder.encode(String) 已弃用,我应该改用啥?

getresuid 在 c99 中是不是已弃用?

PayPal ExpressCheckout 是不是已弃用?

休眠 @NotEmpty 已弃用