我一直在摆弄ASP。NET MVC 4 beta和我现在看到两种类型的控制器:ApiController和Controller。
我有点困惑在什么情况下我可以选择一个特定的控制器。
例如:如果我想返回一个视图,那么我必须使用ApiController或普通控制器?我知道WCF Web API现在已经与MVC集成了。
既然现在我们可以使用两个控制器有人能指出对应的控制器的情况吗。
我一直在摆弄ASP。NET MVC 4 beta和我现在看到两种类型的控制器:ApiController和Controller。
我有点困惑在什么情况下我可以选择一个特定的控制器。
例如:如果我想返回一个视图,那么我必须使用ApiController或普通控制器?我知道WCF Web API现在已经与MVC集成了。
既然现在我们可以使用两个控制器有人能指出对应的控制器的情况吗。
当前回答
I love the fact that ASP.NET Core's MVC6 merged the two patterns into one because I often need to support both worlds. While it's true that you can tweak any standard MVC Controller (and/or develop your own ActionResult classes) to act & behave just like an ApiController, it can be very hard to maintain and to test: on top of that, having Controllers methods returning ActionResult mixed with others returning raw/serialized/IHttpActionResult data can be very confusing from a developer perspective, expecially if you're not working alone and need to bring other developers to speed with that hybrid approach.
这是我迄今为止在ASP中最小化这个问题的最佳技术。NET非核心web应用程序是导入(并正确配置)web API包到基于mvc的web应用程序,所以我可以有最好的两个世界:控制器的视图,ApiControllers的数据。
为了做到这一点,你需要做以下几点:
使用NuGet安装以下Web API包:Microsoft.AspNet.WebApi.Core和Microsoft.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.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);
// ...
}
这种方法——以及它的优点和缺点——在我的博客上的这篇文章中有进一步的解释。
其他回答
I love the fact that ASP.NET Core's MVC6 merged the two patterns into one because I often need to support both worlds. While it's true that you can tweak any standard MVC Controller (and/or develop your own ActionResult classes) to act & behave just like an ApiController, it can be very hard to maintain and to test: on top of that, having Controllers methods returning ActionResult mixed with others returning raw/serialized/IHttpActionResult data can be very confusing from a developer perspective, expecially if you're not working alone and need to bring other developers to speed with that hybrid approach.
这是我迄今为止在ASP中最小化这个问题的最佳技术。NET非核心web应用程序是导入(并正确配置)web API包到基于mvc的web应用程序,所以我可以有最好的两个世界:控制器的视图,ApiControllers的数据。
为了做到这一点,你需要做以下几点:
使用NuGet安装以下Web API包:Microsoft.AspNet.WebApi.Core和Microsoft.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.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);
// ...
}
这种方法——以及它的优点和缺点——在我的博客上的这篇文章中有进一步的解释。
Web API中的每个方法都将返回数据(JSON)而无需序列化。
然而,为了在MVC控制器中返回JSON数据,我们将返回的Action Result类型设置为JsonResult,并在我们的对象上调用JSON方法,以确保它被打包在JSON中。
快速简短回答
如果你想返回一个视图,你应该在“Controller”中。
正常控制器- ASP。NET MVC:如果你在ASP.net Web应用程序中,你处理的是普通的“控制器”。你可以创建Controller-Actions并返回Views()。
ApiController Controller:在开发ASP.net REST api时创建ApiControllers。你不能返回视图(虽然你可以返回Json/Data为HTML字符串)。这些api被认为是后端,它们的函数被调用来返回数据而不是视图
详情请点击此处
如果你在最新的框架4.7.2中创建了一个新的web应用程序,你将默认配置它们,并可以在此基础上构建你的应用程序
你更愿意编写和维护哪一个?
ASP。NET MVC
public class TweetsController : Controller {
// GET: /Tweets/
[HttpGet]
public ActionResult Index() {
return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet);
}
}
ASP。网上广告
public class TweetsController : ApiController {
// GET: /Api/Tweets/
public List<Tweet> Get() {
return Twitter.GetTweets();
}
}