.NET Core中不推荐使用ApiController


68

ApiController在.NET Core中将弃用”的说法是否正确?问,因为我打算在新项目中使用它。


11
简短的回答:是的。答案不是那么简短:Asp.Net MVC和Asp.Net Web API在asp.net-core中合并为一个代码库。因此,它们都继承自,Controller并且都可以返回的实现IActionResult。无论是ViewMVC还是JsonWeb API。您可以根据需要配置核心。docs.asp.net/en/latest/intro.html
Nkosi,

2
[ApiController]从2.1开始添加。见下文。
Riscie

Answers:


82

更新ASP.NET Core 2.1

从ASP.NET Core 2.1开始,可以使用一组新的类型来创建Web API控制器。您可以使用[ApiController]属性注释控制器,该属性启用一些新功能,例如自动模型状态验证和绑定源参数推断。有关更多信息,请参阅文档:https : //docs.microsoft.com/zh-cn/aspnet/core/web-api/index?view= aspnetcore-2.1#annotate-class-with- apicontrollerattribute


实际上ApiController,由于MVC和WebAPI已合并到ASP.NET Core中,因此确实不再存在特定的类。但是,ControllerMVC类带来了仅在开发Web API时可能不需要的许多功能,例如视图和模型绑定。

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

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

要么

创建您的ApiController基类。此处的关键是添加[ActionContext]将当前ActionContext实例注入属性的属性:

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

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

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


1
实际上,这正是ApiControllerWebApi兼容性Shim Package所做的,它只是绑定了更多属性,但它们都基于通过属性github.com/aspnet/Mvc/blob/dev/src/注入的ControlerContext,但是具有更多的兼容性((完全可选),例如路由注册github.com/aspnet/Mvc/blob/dev/src/…或WebApi2 esque属性
Tseng

此注释有助于选择ControllerBase ... // //摘要://没有视图支持的MVC控制器的基类。[控制器]公共抽象类ControllerBase
granadaCoder '18

仅供参考,对于ASP.NET Core 2.1,您的答案已过时,请参阅Riscie的答案ApiControllerAttribute。如果您可以更新答案,那就太好了,因为这是公认的答案:)
user247702

感谢@Stijn的提示。我已经更新了答案。
Henk Mollema

1
@HenkMollema:我仍然感到困惑(在ASP.Net core 2.1中),为什么我们需要同时使用ApiControllerControllerBase之一或两者来表示Web API控制器类。为什么同一任务存在两件事,即制作一个API?
Koder101 '18

28

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

与属性结合的功能包括:

  • 验证错误会自动触发HTTP 400响应。
  • 没有更多的需要定义[FromBody][FromRoute]......明确属性

链接到文档:

更新资料

还有一个ControllerBase控制器可以继承的基类,它适合api控制器,因为它忽略了所有与视图相关的功能。


10
是否有任何资源可以显示ApiControllerControllerBase之间的比较分析,即一个人可以做什么而另一个不能或何时使用?这真是令人困惑。
Koder101 '18

1
@ Koder101完全同意您的看法。一堆功能几乎相同的功能,却没有可以比较的优质资源。
pantonis

1
本文档告诉您每个项目给您带来什么好处(ApiController属性和ControllerBase继承):docs.microsoft.com/zh-cn/aspnet/core/web-api/…–
CleverPatrick

11

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

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

在ASP.NET Core中,根本不再需要这样做。的Controller基类可以用于从剃刀浏览或JSON返回HTML动作(与输出格式化XML和其他格式也是可能的)。您甚至不需要Controller基类。甚至可以在不继承的情况下使用“普通C#对象”作为控制器。这是一个演示控制器的示例,即使不存在ApiController,将数据传递到客户端的结构方法也是相似的。

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

5
当我读到您的Demo-Controller是一个没有Controller继承的POC,然后在您的代码中您从Controller继承时,我笑了起来-我肯定是错字了:)
Steve

6

就像其他人提到的那样,ASP.NET Core是一个全新的Web堆栈,与旧的ASP.NET MVC Web堆栈不兼容。这明确体现在名称和版本中!

ASP.NET Core和ASP.NET Core MVC具有版本1.0.0,以使这种不兼容性非常清楚。

ASP.NET Core将MVC和WebApi合并为一个单一的Api(称为Api)。

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

如果要从以前的ASP.NET MVC或ASP.NET WebApi应用程序进行迁移,则可能要导入该Microsoft.AspNetCore.Mvc.WebApiCompatShim软件包,该软件包提供了一些兼容性类型,从而使从先前版本的迁移更加容易。其中包括ApiController在新的Webstack Api中删除的类和某些属性。

但是,请注意,这仅用于帮助您迁移现有应用程序。创建新应用程序时,您不应使用此兼容性填充程序,而应使用新内容。


1
请注意,该Microsoft.AspNetCore.Mvc.WebApiCompatShim功能仅适用于ASP.NET Core 2.x-在3.x中已消失。
伊恩·坎普
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.