我一直在尝试 ASP.NET MVC 4 beta,并且现在有两种类型的控制器:ApiController
和 Controller
。
我有点困惑在什么情况下可以选择特定的控制器。
例如:如果我要返回一个视图,那么我应该使用Controller
还是普通的ApiController
? 我知道 WCF Web API 现在已经与 MVC 集成了。
既然现在我们可以使用这两个控制器,有人可以指出在哪些情况下选择相应的控制器吗?
我一直在尝试 ASP.NET MVC 4 beta,并且现在有两种类型的控制器:ApiController
和 Controller
。
我有点困惑在什么情况下可以选择特定的控制器。
例如:如果我要返回一个视图,那么我应该使用Controller
还是普通的ApiController
? 我知道 WCF Web API 现在已经与 MVC 集成了。
既然现在我们可以使用这两个控制器,有人可以指出在哪些情况下选择相应的控制器吗?
你更喜欢编写和维护哪个?
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();
}
}
Controller
类。 - TânApiController
,只需使用 : Controller
即可。您希望我也添加一个新的 .NET Core 控制器示例。 - Ashish KambleJson()
版本。它更清晰明确。我不喜欢在尝试弄清楚我的代码如何响应请求时出现大量黑魔法。 - Jez我喜欢 ASP.NET Core 的 MVC6 将这两种模式合并,因为我经常需要同时支持两个世界。虽然你可以调整任何标准的 MVC Controller
(和/或开发自己的 ActionResult
类)来像 ApiController
一样行事和表现,但是这很难维护和测试:除此之外,控制器方法返回混合了原始序列化数据或 IHttpActionResult
数据的 ActionResult
可以让开发人员感到非常困惑,特别是如果你不是在独自工作,还需要与其他开发人员共同处理这种混合方法。
到目前为止,我发现在 ASP.NET 非 Core 网络应用程序中最好的技术是将 Web API 包导入(并正确配置)到基于 MVC 的 Web 应用程序中,这样我就可以拥有两全其美的优点:视图使用 Controllers
,数据使用 ApiControllers
。
要做到这一点,您需要执行以下操作:
Microsoft.AspNet.WebApi.Core
和 Microsoft.AspNet.WebApi.WebHost
。/Controllers/
文件夹添加一个或多个 ApiControllers。/App_Config/
文件夹添加以下 WebApiConfig.cs 文件: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
类中(根据您是否使用OWIN Startup模板,可以是Startup.cs
或Global.asax.cs
)。
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);
// ...
}
这种方法及其利弊在我博客上写的这篇文章中有进一步解释。
Controller
肯定比一个可以直接返回[Serializable]
项目列表的ApiController
更难测试和维护。任何测试方法都会更容易编写,因为您不必每次手动反序列化:对于ASP.NET或其他框架的几乎任何系统集成任务也是如此。Controllers
很棒,但至少在.NET Framework 4.x中,ApiControllers
更适合RESTful任务。 - Darkseal简要回答:
如果你想返回一个视图,你应该在“Controller”中操作。
普通控制器 - ASP.NET MVC:如果你是在ASP.net Web应用程序中,你要处理普通的“Controller”。你可以创建控制器操作并返回Views()。
ApiController控制器:当你开发ASP.net REST API时,你要创建ApiControllers。你不能返回视图(虽然你可以返回Json/Data来代替HTML字符串)。这些API被认为是后端,它们的功能是调用返回数据而不是视图。
在 Asp.net Core 3+ 版本中
Controller: 如果想要返回任何与 IActionResult 和 Data 相关的内容,请使用 Controllercontroller
ApiController: 用作 API 控制器中的属性/注释。继承 ControllerBase 类
ControllerBase: 如果只想返回数据,请使用 ControllerBase 类
ApiController
和Controller
,因此如果您正在使用更新的.NET版本,则无需再担心ApiController了 - https://learn.microsoft.com/en-us/aspnet/core/tutorials/first-web-api - Simon_Weaver