我一直在玩 ASP.NET MVC 4 beta,现在我看到了两种类型的控制器:ApiController
和Controller
.
在什么情况下我可以选择特定的控制器时,我有点困惑。
例如:如果我想返回一个视图,那么我必须使用ApiController
还是普通的Controller
?我知道 WCF Web API 现在已与 MVC 集成。
由于现在我们可以同时使用这两个控制器,有人可以指出在哪些情况下使用相应的控制器。
我一直在玩 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 控制器上的操作不返回视图,而是返回数据。
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();
}
}
我喜欢 ASP.NET Core 的 MVC6 将这两种模式合二为一这一事实,因为我经常需要同时支持这两种模式。虽然您确实可以调整任何标准 MVC (和Controller
/或开发自己的类)以ActionResult
像ApiController
.从开发人员的角度来看,返回原始/序列化/数据可能会非常混乱,特别是如果您不是单独工作并且需要让其他开发人员加快使用这种混合方法的速度。ActionResult
IHttpActionResult
迄今为止,为了最大限度地减少 ASP.NET 非核心 Web 应用程序中的该问题,我采用的最佳技术是将 Web API 包导入(并正确配置)到基于 MVC 的 Web 应用程序中,这样我就可以两全其美了worlds:Controllers
用于视图,ApiControllers
用于数据。
为此,您需要执行以下操作:
Microsoft.AspNet.WebApi.Core
和Microsoft.AspNet.WebApi.WebHost
./Controllers/
文件夹中。/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);
// ...
}
我在博客上写的这篇文章进一步解释了这种方法及其优缺点。
快速 n 简答
如果你想返回一个视图,你应该在"Controller"中。
普通控制器 - 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 平台。
在 Asp.net Core 3+ 版本中
Controller:如果还想返回与 IActionResult & Data 相关的任何内容,请选择 Controller控制器
ApiController:用作 API 控制器中的属性/符号。继承 ControllerBase 类
ControllerBase:如果想返回数据只去 ControllerBase 类