.NET Core 中是否弃用了 ApiController

Is ApiController deprecated in .NET Core

ApiController 将在 .NET Core 中弃用”是真的吗?询问,因为我打算在新项目中使用它。

在 ASP.NET 中,核心使用 ASP.NET MVC 和 ASP.NET WepAPI 中已知的术语和概念。但基本上它是一个全新的框架。因此,我们可以简单地忘记几个概念或基础 classes。

ASP.NET MVC 和 ASP.NET WebApi 是两个共存但不同的框架,因此必须通过使用 ApiController 作为基础来指定控制器作为 WebApi 控制器class.

在 ASP.NET Core 中,这根本没有必要了。 Controller 基础 class 可用于 return HTML 来自 Razor Views 或 JSON 的操作(使用输出格式化程序 XML 和其他格式也可以)。您甚至不需要 Controller 基础 class。甚至可以在没有继承的情况下将“普通旧 C# 对象”用作 Controller

下面是要概述的演示控制器示例,即使 ApiController 不存在,向客户端传递数据的结构方法也是相似的。

public class DemoController : Controller
{       
     public async Task<IActionResult> Action()
     {
         var model = await _someService.GetPreciousData();
         return Ok(model);
     }
 }

正如其他人所提到的,ASP.NET Core 是一个全新的 webstack,它与旧的 ASP.NET MVC webstack 不兼容。这明确反映在它的名称和版本中!

ASP.NET Core 和 ASP.NET Core MVC 的版本为 1.0.0,这使得这种不兼容性非常明显。

ASP.NET 核心将 MVC 和 WebApi 合并为一个 Api 刚刚调用。

这就是您可能一直在寻找的东西:

如果 您是从以前的 ASP.NET MVC 或 ASP.NET WebApi 应用程序迁移,您可能需要导入 Microsoft.AspNetCore.Mvc.WebApiCompatShim 包,它提供了一些兼容性类型,使从以前的版本迁移更容易。其中包括 ApiController class 和在新 webstack Api 中删除的某些属性。

但是,请注意,这仅用于帮助您迁移现有应用程序。当你创建一个新的应用程序时,你不应该使用这个兼容性垫片而只使用新的东西。

更新ASP.NET核心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 class 因为 MVC 和 WebAPI 已经合并到 ASP.NET 核心。但是,MVC 的 Controller class 带来了一堆您在仅开发 Web API 时可能不需要的功能,例如视图和模型绑定。

如果您想要不同的东西,您有两个选择:

使用 Microsoft.AspNetCore.Mvc.Core 包中的 ControllerBase class。

创建您的 ApiController 基地 class。这里的关键是添加 [ActionContext] 属性,该属性将当前 ActionContext 实例注入 属性:

[Controller]
public abstract class ApiController
{
    [ActionContext]
    public ActionContext ActionContext { get; set; }
}

此外,将 [Controller] 属性添加到 class 以将其标记为 MVC 控制器发现的控制器。

在我的 “Web API in MVC 6” blogpost 中查看更多详细信息。

[ApiController] 属性实际上已在 ASP.NET 核心版本 2.1 中重新添加。

与属性相结合的特征是:

  • 验证错误会自动触发 HTTP 400 响应。
  • 不再需要明确定义 [FromBody][FromRoute]、...属性

文档链接:

更新

还有基类 ControllerBase 供控制器继承,适用于 api 控制器,因为它省略了所有与视图相关的功能。