我一直在使用 ASP.NET MVC 4 beta,现在我看到了两种类型的控制器:ApiController
和 Controller
。
在什么情况下我可以选择特定的控制器时,我有点困惑。
例如:如果我想返回一个视图,那么我必须使用 ApiController
还是普通的 Controller
?我知道 WCF Web API 现在已与 MVC 集成。
由于现在我们可以同时使用这两个控制器,有人可以指出在哪些情况下使用相应的控制器。
ApiController
和 Controller
,因此如果您使用较新的 .NET,则无需再担心 ApiController - docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api
使用 Controller 渲染您的普通视图。 ApiController 操作仅返回序列化并发送到客户端的数据。
引用:
注意 如果您使用过 ASP.NET MVC,那么您已经熟悉控制器。它们在 Web API 中的工作方式类似,但 Web API 中的控制器派生自 ApiController 类而不是 Controller 类。您会注意到的第一个主要区别是 Web API 控制器上的操作不返回视图,而是返回数据。
ApiControllers 专门用于返回数据。例如,他们负责将数据透明地序列化为客户端请求的格式。此外,它们默认遵循不同的路由方案(例如:将 URL 映射到操作),按照约定提供 REST-ful API。
您可能可以使用 Controller 而不是 ApiController 和 some(?) 手动编码来做任何事情。最后,这两个控制器都建立在 ASP.NET 基础之上。但如今,拥有一个 REST-ful API 是如此普遍的需求,以至于创建 WebAPI 是为了简化此类 API 的实现。
在两者之间做出决定相当简单:如果您正在编写基于 HTML 的 web/internet/intranet 应用程序 - 可能偶尔 AJAX 调用会在这里和那里返回 json - 坚持使用 MVC/Controller。如果您想为系统提供数据驱动/REST-ful 接口,请使用 WebAPI。当然,您可以将两者结合起来,让 ApiController 满足来自 MVC 页面的 AJAX 调用。
举一个真实的例子:我目前正在使用一个 ERP 系统,该系统为其实体提供 REST-ful API。对于这个 API,WebAPI 将是一个不错的选择。同时,ERP 系统提供了一个高度 AJAX 化的 Web 应用程序,您可以使用它来为 REST-ful API 创建查询。 Web 应用程序本身可以实现为 MVC 应用程序,利用 WebAPI 来获取元数据等。
您更愿意编写和维护哪个?
ASP.NET MVC
public class TweetsController : Controller {
// GET: /Tweets/
[HttpGet]
public ActionResult Index() {
return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet);
}
}
ASP.NET Web API
public class TweetsController : ApiController {
// GET: /Api/Tweets/
public List<Tweet> Get() {
return Twitter.GetTweets();
}
}
Controller
类派生的。
ApiController
只需 : Controller
工作,你能添加新的 dot net core Controller 例子吗
Json()
版本。它更清晰,更明确。我不喜欢在试图弄清楚我的代码将如何响应请求时使用大量黑魔法。
我喜欢 ASP.NET Core 的 MVC6 将这两种模式合二为一这一事实,因为我经常需要同时支持这两种模式。虽然您确实可以调整任何标准 MVC Controller
(和/或开发自己的 ActionResult
类)来执行和行为就像一个 ApiController
,它可能很难维护和测试:最重要的是,返回 ActionResult
的 Controllers 方法与返回原始/序列化/IHttpActionResult
数据的其他方法混合在一起从开发人员的角度来看,这可能会非常令人困惑,特别是如果您不是一个人工作并且需要让其他开发人员加快使用这种混合方法的速度。
迄今为止,为了最大限度地减少 ASP.NET 非核心 Web 应用程序中的该问题,我采用的最佳技术是将 Web API 包导入(并正确配置)到基于 MVC 的 Web 应用程序中,这样我就可以两全其美了世界:Controllers
用于视图,ApiControllers
用于数据。
为此,您需要执行以下操作:
使用 NuGet 安装以下 Web API 包:Microsoft.AspNet.WebApi.Core 和 Microsoft.AspNet.WebApi.WebHost。
将一个或多个 ApiControllers 添加到您的 /Controllers/ 文件夹。
将以下 WebApiConfig.cs 文件添加到您的 /App_Config/ 文件夹:
using System.Web.Http;
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
最后,您需要将上述类注册到您的 Startup 类(Startup.cs
或 Global.asax.cs
,具体取决于您是否使用 OWIN Startup 模板)。
启动.cs
public void Configuration(IAppBuilder app)
{
// Register Web API routing support before anything else
GlobalConfiguration.Configure(WebApiConfig.Register);
// The rest of your file goes there
// ...
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ConfigureAuth(app);
// ...
}
全球.asax.cs
protected void Application_Start()
{
// Register Web API routing support before anything else
GlobalConfiguration.Configure(WebApiConfig.Register);
// The rest of your file goes there
// ...
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
// ...
}
我在博客上写的 this post 进一步解释了这种方法及其优缺点。
ActionResult
中的 Json 序列化字符串的 Controller
肯定比可以设置为直接返回 [Serializable]
项列表的 ApiController
更难测试和维护。任何测试方法都会更容易编写,因为您不必每次都手动反序列化:几乎所有与 ASP.NET 或其他框架的系统集成任务都可以这样说。 Controllers
很棒,但 ApiControllers
更适合 RESTful 任务,至少在 .NET Framework 4.x 中
快速 n 简答
如果你想返回一个视图,你应该在“控制器”中。
普通控制器 - ASP.NET MVC:如果您在 ASP.NET Web 应用程序中,则处理普通的“控制器”。您可以创建 Controller-Actions 并且可以返回 Views()。
ApiController 控制器:在开发 ASP.net REST API 时创建 ApiController。您不能返回视图(尽管您可以将 HTML 的 Json/Data 作为字符串返回)。这些 api 被视为后端,它们的函数被调用以返回数据而不是视图
Web API 中的每个方法都将返回数据 (JSON) 而无需序列化。
但是,为了在 MVC 控制器中返回 JSON 数据,我们将返回的 Action Result 类型设置为 JsonResult 并在我们的对象上调用 Json 方法以确保它被封装在 JSON 中。
主要区别在于:Web API 是为任何客户端、任何设备提供的服务,而 MVC 控制器只为它的客户端服务。一样,因为它是 MVC 平台。
https://i.stack.imgur.com/VJ8HM.png
如果您在最新的框架 4.7.2 中创建一个新的 Web 应用程序,您将默认配置它们,并且可以在该框架上构建您的应用程序
https://i.stack.imgur.com/LwFza.jpg
在 Asp.net Core 3+ 版本中
Controller:如果想要返回任何与 IActionResult &还有数据,选择控制器controller
ApiController:用作 API 控制器中的属性/符号。继承 ControllerBase 类
ControllerBase:如果想返回数据只去 ControllerBase 类