我一直在玩ASP.NET MVC 4测试版,我现在看到两种类型的控制器:ApiController
和Controller
。
我对可以选择特定控制器的情况感到困惑。
例如:如果我想要返回视图,那么我将使用ApiController
或普通Controller
?我知道WCF Web API现在已与MVC集成。
从现在开始我们可以使用两个控制器,有人可以指出在哪种情况下使用相应的控制器。
答案 0 :(得分:320)
使用Controller渲染普通视图。 ApiController操作仅返回序列化并发送到客户端的数据。
<强> here is the link 强>
引用:
注意如果您使用过ASP.NET MVC,那么您已经熟悉了控制器。它们在Web API中的工作方式类似,但Web API中的控制器派生自ApiController类而不是Controller类。您将注意到的第一个主要区别是Web API控制器上的操作不返回视图,它们返回数据。
ApiControllers专门用于返回数据。例如,它们负责将数据透明地序列化为客户端请求的格式。此外,它们默认遵循不同的路由方案(如:将URL映射到操作),按惯例提供REST-ful API。
你可以使用Controller而不是带有一些(?)手动编码的ApiController来做任何事情。最后,两个控制器都建立在ASP.NET基础之上。但是,拥有REST-ful API是如此普遍的要求,即创建WebAPI是为了简化这种API的实现。
在两者之间做出决定相当简单:如果你正在编写一个基于HTML的web / internet / intranet应用程序 - 可能偶尔会在这里和那里返回json的AJAX调用 - 坚持使用MVC / Controller。如果要为系统提供数据驱动/ REST-ful接口,请使用WebAPI。当然,你可以将两者结合起来,让ApiController从MVC页面调用AJAX调用。
举一个现实世界的例子:我目前正在使用ERP系统,为其实体提供REST-ful API。对于此API,WebAPI将是一个很好的候选者。同时,ERP系统提供了一个高度AJAX-ified的Web应用程序,您可以使用它来为REST-ful API创建查询。 Web应用程序本身可以实现为MVC应用程序,利用WebAPI来获取元数据等。
答案 1 :(得分:180)
您更愿意写作和维护?
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();
}
}
答案 2 :(得分:24)
我喜欢ASP.NET Core的MVC6将这两种模式合并为一种,因为我经常需要支持这两种模式。虽然您可以调整任何标准MVC Controller
(和/或开发自己的ActionResult
类)来行动和放弃。行为就像ApiController
一样,维护和测试非常困难:最重要的是,让控制器方法返回ActionResult
混合其他返回raw / serialized /从开发人员的角度来看,IHttpActionResult
数据可能会非常混乱,尤其是如果您不是单独工作并且需要让其他开发人员加快这种混合方法的速度。
到目前为止,我最好的技术是将ASP.NET非核心Web应用程序中的问题最小化,将Web API包导入(并正确配置)到基于MVC的Web应用程序中,所以我可以使用最好的两个方面: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.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);
// ...
}
<强>的Global.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进一步解释了这种方法及其利弊。
答案 3 :(得分:1)
Web API中的每个方法都将返回数据(JSON)而不进行序列化。
但是,为了在MVC控制器中返回JSON数据,我们将返回的Action Result类型设置为JsonResult并在对象上调用Json方法以确保它以JSON打包。
答案 4 :(得分:1)
快速n简短答案
如果要返回视图,则应位于“控制器” 中。
普通控制器-ASP.NET MVC::如果您在ASP.net Web应用程序中,则处理普通的“控制器”。您可以创建Controller-Action,还可以返回Views()。
ApiController控制器:在开发ASP.net REST API时创建ApiController。您无法返回Views(尽管您可以将HTML的Json / Data作为字符串返回)。这些api被视为后端,它们的函数被调用以返回数据而不是视图
请不要forgt将此标记为答案,请注意
答案 5 :(得分:0)
主要区别在于:Web API是为任何客户端,任何设备提供的服务,而MVC Controller仅为其客户端提供服务。一样,因为它是MVC平台。
答案 6 :(得分:0)
几乎是一个,但是,MVC和API之间的名称,使用目的和透明度不同。
答案 7 :(得分:0)
答案 8 :(得分:-1)
在两者之间做出决定相当简单:如果你正在编写一个基于HTML的web / internet / intranet应用程序 - 可能偶尔会在这里和那里返回json的AJAX调用 - 坚持使用MVC / Controller。如果要为系统提供数据驱动/ REST-ful接口,请使用WebAPI。当然,您可以将两者结合起来,从MVC页面获得ApiController来处理AJAX调用。 基本上控制器用于mvc和api-controller用于Rest- 您可以根据需要在同一程序中使用API
答案 9 :(得分:-1)
在Asp.net Core 3+ Vesrion中
控制器:如果还想返回与IActionResult和数据有关的任何内容,请使用控制器controller
ApiController :用作API控制器中的属性/符号。那继承了ControllerBase类
ControllerBase :如果只想返回数据,请使用ControllerBase类