在.NET 内核中不推荐使用 ApiController

ApiController将在。NET 核心”?因为我打算在新项目中使用它。

68359 次浏览

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

NET MVC 和 ASP.NET WebApi 是两个并存但不同的框架,因此必须明确使用 ApiController作为基类将控制器指定为 WebApi 控制器。

在 ASP.NET Core 中,这已经没有必要了。Controller基类可用于从 Razor View 或 JSON 返回 HTML 的操作(也可以使用 XML 和其他格式的输出格式化器)。你甚至不需要 Controller基类。甚至可以使用“普通的旧 C # 对象”作为没有继承的 Controller

下面是一个示例演示控制器来概述,即使没有 ApiController,向客户机交付数据的结构方法也是类似的。

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

正如其他人提到的,ASP.NET Core 是一个全新的网络栈,与旧的 ASP.NET MVC 网络栈不兼容。这显式地反映在它的名称和版本控制中!

NET Core 和 ASP.NET Core MVC 的1.0.0版本非常清楚地表明了这种不兼容性。

NET 内核将 MVC 和 WebApi 合并为一个刚刚调用的 API。

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

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

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

更新 ASP.NET Core 2.1

自 ASP.NET Core 2.1以来,一组新的类型可用于创建 Web API 控制器。您可以使用 [ApiController]属性对控制器进行注释,该属性支持一些新特性,例如自动模型状态验证和绑定源参数推断。有关更多信息,请参见文档: Https://learn.microsoft.com/en-us/aspnet/core/web-api/index?view=aspnetcore-2.1#annotate-class-with-apicontrollerattribute.


由于 MVC 和 WebAPI 已经合并到 ASP.NET 核心中,因此实际上已经没有特定的 ApiController类了。但是,MVC 的 Controller类带来了一些特性,在开发 Web API 时可能不需要这些特性,比如视图和模型绑定。

如果你想要不一样的东西,你有两个选择:

使用 微软。 AspNetCore包中的 ControllerBase类。

或者

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

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

另外,将 [Controller]属性添加到类中,将其标记为用于发现 MVC 控制器的控制器。

在我的 “ MVC 6中的 Web API”blog post中可以看到更多的细节。

[ApiController]属性实际上是在 ASP.NET Core 2.1版本中添加回来的。

与属性相结合的特性包括:

  • 验证错误会自动触发 HTTP400响应。
  • 不再需要显式地定义 [FromBody][FromRoute]、 ... 属性

文件链接:

更新

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