ApiController和ASP.NET MVC中控制器的区别
我一直在玩ASP.NET MVC 4测试版,我现在看到两种类型的控制器: 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。
你可以使用控制器而不是使用ApiController进行一些(?)手动编码。 最终,两个控制器都建立在ASP.NET基础之上。 但是如今有一个REST-ful API是一个共同的要求,即创建WebAPI来简化这种API的实现。
在这两者之间做出相当简单的决定:如果您正在编写基于HTML的Web / Internet / Intranet应用程序 - 可能偶尔会发生AJAX调用返回json的情况 - 坚持使用MVC / Controller。 如果您想为系统提供数据驱动/ REST-ful接口,请使用WebAPI。 当然,您可以将两者结合起来,从一个MVC页面中获取一个ApiController cater AJAX调用。
举一个真实世界的例子:我目前正在使用为其实体提供REST-ful API的ERP系统。 对于这个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
一样行为和表现,但维护和测试可能非常困难:最重要的是,使用Controllers方法返回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类( Startup.cs
或Global.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);
// ...
}
这种方法 - 连同其优点和缺点 - 将在下面的文章中进一步解释。
链接地址: http://www.djcxy.com/p/20523.html上一篇: Difference between ApiController and Controller in ASP.NET MVC