ApiController和ASP.NET MVC中控制器的区别

我一直在玩ASP.NET MVC 4testing版,我现在看到两种types的控制器: ApiControllerController

我有点困惑,在什么情况下我可以select一个特定的控制器。

例如:如果我想返回一个视图,那么我必须使用ApiController或普通的Controller ? 我知道WCF Web API现在已经与MVC集成在一起了。

既然现在我们可以使用两个控制器,请有人指出在哪个情况下去相应的控制器。

使用控制器来渲染你的普通视图。 ApiController操作仅返回序列化并发送到客户端的数据。

链接在这里

引用:

注意如果您使用ASP.NET MVC,那么您已经熟悉控制器。 它们在Web API中的工作方式类似,但Web API中的控制器派生自ApiController类而不是Controller类。 您将注意到的第一个主要区别是Web API控制器上的操作不会返回视图,而是返回数据。

ApiControllers专门用于返回数据。 例如,他们负责透明地将数据序列化成客户请求的格式。 另外,它们默认遵循不同的路由scheme(如:将URL映射到操作),按惯例提供REST-ful API。

你可以用一些控制器而不是一个ApiController来完成一些(?)手动编码。 最后,两个控制器都build立在ASP.NET基础之上。 但是,现在有一个REST-ful API是一个常见的需求,即创buildWebAPI来简化这种API的实现。

在这两者之间做出相当简单的决定:如果你正在编写一个基于HTML的web / internet / intranet应用程序 – 可能偶尔会有AJAX调用返回json,那么就使用MVC / Controller吧。 如果您想为系统提供数据驱动/ REST-ful接口,请使用WebAPI。 你可以把两者结合起来,当然,从一个MVC页面中有一个ApiController的cater AJAX调用。

举一个真实世界的例子:我目前正在使用为其实体提供REST-ful API的ERP系统。 对于这个API,WebAPI将是一个不错的select。 与此同时,ERP系统提供了一个高度AJAX的Web应用程序,您可以使用它来为REST-ful API创build查询。 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类)来performance和ApiController ,但是维护和testing可能非常困难:最重要的是,使用Controllers方法返回ActionResult与其他人混合返回raw / serialized / IHttpActionResult数据可能会从开发人员的angular度非常混乱,特别是如果你不是一个人工作,需要带来其他开发人员加快混合方法。

为了最大限度地减lessASP.NET非核心Web应用程序中的问题,迄今为止最好的技术是将Web API包导入(并正确configuration)到基于MVC的Web应用程序中,这样我就可以同时兼顾世界:视图的Controllers ,数据的ApiControllers

为了做到这一点,你需要做到以下几点:

  • 使用NuGet安装以下Web API软件包: Microsoft.AspNet.WebApi.CoreMicrosoft.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.csGlobal.asax.cs ,具体取决于您是否使用OWIN Startup模板)。

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); // ... } 

这个方法 – 连同它的优点和缺点 – 将在下面的文章中进一步解释。