ASP.NET MVC 中 ApiController 和 Controller 的区别
-
14-11-2019 - |
题
我一直在使用 ASP.NET MVC 4 beta,现在看到两种类型的控制器: ApiController
和 Controller
.
我对在什么情况下可以选择特定的控制器有点困惑。
例如:如果我想返回视图那么我必须使用 ApiController
或普通的 Controller
?我知道 WCF Web API 现在已与 MVC 集成。
既然现在我们可以使用这两个控制器,有人可以指出在哪些情况下可以使用相应的控制器吗?
解决方案
使用 Controller 渲染您的普通视图。ApiController 操作仅返回序列化并发送到客户端的数据。
引用:
注意如果您使用过 ASP.NET MVC,那么您已经熟悉控制器。它们在 Web API 中的工作方式类似,但 Web API 中的控制器派生自 ApiController 类而不是 Controller 类。您会注意到的第一个主要区别是 Web API 控制器上的操作不返回视图,而是返回数据。
ApiController 专门用于返回数据。例如,它们负责将数据透明地序列化为客户端请求的格式。此外,它们默认遵循不同的路由方案(如下所示:将 URL 映射到操作),按照约定提供 REST-ful API。
您可能可以使用 Controller 而不是 ApiController 以及一些(?)手动编码来执行任何操作。最后,这两个控制器都构建在 ASP.NET 基础上。但如今拥有 REST 风格的 API 已成为一种常见的需求,因此创建 WebAPI 是为了简化此类 API 的实现。
在两者之间做出决定相当简单:如果您正在编写基于 HTML 的 Web/Internet/Intranet 应用程序 - 可能偶尔会出现 AJAX 调用,到处返回 json - 坚持使用 MVC/Controller。如果您想向系统提供数据驱动/REST 接口,请使用 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();
}
}
我喜欢 ASP.NET Core 的 MVC6 将这两种模式合并为一个,因为我经常需要支持这两个世界。虽然您确实可以调整任何标准 MVC Controller
(和/或开发自己的 ActionResult
类)的行为和行为就像 ApiController
, ,维护和测试可能非常困难:最重要的是,有 控制器 方法返回 ActionResult
与其他返回原始/序列化/的混合IHttpActionResult
从开发人员的角度来看,数据可能会非常令人困惑,特别是如果您不是单独工作并且需要让其他开发人员加快使用这种混合方法的速度。
到目前为止,我在 ASP.NET 非 Core Web 应用程序中最小化该问题的最佳技术是将 Web API 包导入(并正确配置)到基于 MVC 的 Web 应用程序中,这样我就可以兼得两者的优点世界: Controllers
对于视图, ApiControllers
用于数据。
为此,您需要执行以下操作:
- 使用 NuGet 安装以下 Web API 包:
Microsoft.AspNet.WebApi.Core
和Microsoft.AspNet.WebApi.WebHost
. - 将一个或多个 ApiController 添加到您的
/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.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);
// ...
}
这种方法及其优点和缺点在 这个帖子 我写在我的博客上。
Web API 中的每个方法都会返回未经序列化的数据(JSON)。
但是,为了在 MVC 控制器中返回 JSON 数据,我们将返回的 Action Result 类型设置为 JsonResult 并调用对象上的 Json 方法以确保它以 JSON 形式打包。
主要区别是:Web API是为任何客户端、任何设备提供的服务,而MVC控制器只为它的客户端服务。同样因为它是MVC平台。
在两者之间做出决定相当简单:如果您正在编写基于 HTML 的 Web/Internet/Intranet 应用程序 - 可能偶尔会出现 AJAX 调用,到处返回 json - 坚持使用 MVC/Controller。如果您想向系统提供数据驱动/REST 接口,请使用 WebAPI。当然,您可以将两者结合起来,让 ApiController 满足来自 MVC 页面的 AJAX 调用。基本上,控制器用于MVC,并且API-Controller用于REST- API您可以在同一程序中同时使用