ASP. ApiController与Controller的区别。NET MVC

我一直在摆弄ASP。NET MVC 4 beta和我现在看到两种类型的控制器:ApiControllerController

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

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

既然现在我们可以使用两个控制器有人能指出对应的控制器的情况吗。

285068 次浏览

使用Controller来呈现正常的视图。ApiController动作只返回已序列化并发送给客户端的数据。

这里是链接

引用:

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

ApiControllers专门用于返回数据。例如,它们负责将数据透明地序列化为客户端所请求的格式。此外,它们默认情况下遵循不同的路由方案(例如:将url映射到动作),根据约定提供REST-ful API。

你可能可以使用Controller而不是ApiController来做任何事情,并使用一些(?)手动编码。最后,这两个控制器都是建立在ASP。净的基础。但是拥有一个REST-ful 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非核心web应用程序是导入(并正确配置)web API包到基于mvc的web应用程序,所以我可以有最好的两个世界:Controllers为视图,ApiControllers为数据。

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

  • 使用NuGet安装以下Web API包:Microsoft.AspNet.WebApi.CoreMicrosoft.AspNet.WebApi.WebHost
  • /Controllers/文件夹中添加一个或多个ApiControllers。
  • 将以下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.csGlobal.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);
// ...
}

这种方法-以及它的优点和缺点-在我的博客上写的这篇文章中进一步解释。

Web API中的每个方法都将返回数据(JSON)而无需序列化。

然而,为了在MVC控制器中返回JSON数据,我们将返回的Action Result类型设置为JsonResult,并在我们的对象上调用JSON方法,以确保它被打包在JSON中。

主要的区别是:Web API是针对任何客户端、任何设备的服务,而MVC控制器只服务于它的客户端。同样,因为它是MVC平台。

快速简短回答

如果你想返回一个视图,你应该在“Controller"中。

正常控制器- ASP。NET MVC:你处理正常的“控制器”;如果你在ASP.net Web应用程序。你可以创建Controller-Actions并返回Views()。

ApiController控制器:你在开发ASP.net REST api时创建ApiControllers。你不能返回视图(虽然你可以返回Json/Data为HTML字符串)。这些api被认为是后端,它们的函数被调用来返回数据而不是视图

更多细节在这里

在Asp.net Core 3+ Vesrion

控制器: If想返回任何与IActionResult相关的东西;Data也是,选择Controller控制器

ApiController:在API控制器中用作属性/符号。它继承了ControllerBase类

ControllerBase:如果想返回数据,只返回ControllerBase类

enter image description here

如果你在最新的框架4.7.2中创建了一个新的web应用程序,你将默认配置它们,并可以在此基础上构建你的应用程序

enter image description here