Разница между ApiController и регулятором внутри ASP.NET MVC
Я играл вокруг с ASP.NET MVC 4 beta и теперь я вижу два типа контроллеров:ApiController и Controller.
Я немного смущен тем, в каких ситуациях я могу выбрать конкретный контроллер.
например: если я хочу вернуть представление, то я должен использовать ApiController или обычный Controller? Я знаю, что веб-API WCF теперь интегрирован с MVC.
так как теперь мы можем использовать оба контроллера может кто-нибудь указать, в каких ситуациях идти на соответствующий контроллер.
5 ответов:
используйте контроллер для отображения обычных представлений. Действие ApiController возвращает только те данные, которые сериализованы и отправлены клиенту.
цитата:
Примечание, Если вы работали с ASP.NET MVC, тогда вы уже знакомы с контроллерами. Они работают аналогично в Web API, но контроллеры в Web API являются производными от класса ApiController вместо класса Controller. Первое главное отличие вы заметите, что действия на контроллерах Web API не возвращают представления, они возвращают данные.
ApiControllers специализируются на возврате данных. Например, они заботятся о прозрачной сериализации данных в формат, запрошенный клиентом. Кроме того, по умолчанию они следуют другой схеме маршрутизации (например: сопоставление URL-адресов с действиями), предоставляя API REST-ful по соглашению.
вы могли бы сделать что-нибудь с помощью контроллера вместо ApiController с некоторыми(?) ручное кодирование. В конце концов, оба контроллера основываются на ASP.NET фундамент. Но наличие REST-ful API является таким распространенным требованием сегодня, что WebAPI был создан для упрощения реализации такого API.
довольно просто решить между ними: если вы пишете приложение на основе HTML web/internet/intranet - возможно, со случайным вызовом AJAX, возвращающим json здесь и там - придерживайтесь MVC / Controller. Если вы хотите предоставить управляемый данными / REST-ful интерфейс к системе, идет с WebAPI. Вы можете объединить оба, конечно, имея ApiController cater AJAX вызовы со страницы MVC.
чтобы дать реальный пример: в настоящее время я работаю с ERP-системой, которая предоставляет REST-ful API для своих объектов. Для этого API WebAPI был бы хорошим кандидатом. В то же время ERP-система предоставляет высокоэффективное веб-приложение AJAX, которое можно использовать для создания запросов для REST-ful API. Само веб-приложение может быть реализован как приложение 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 Mvc6 ядра объединил два шаблона в один, потому что мне часто нужно поддерживать оба мира. Хотя это правда, что вы можете настроить любой стандартный MVC
Controller(и / или разработать свой собственныйActionResultклассы) действовать и вести себя так же, какApiController, это может быть очень трудно поддерживать и тестировать: кроме того, имея контроллеры методы возвратаActionResultсмешанный с другими возвращающими raw / serialized/IHttpActionResultданные могут быть очень запутанными от разработчика перспектива, особенно если вы не работаете в одиночку и вам нужно ускорить других разработчиков с помощью этого гибридного подхода.лучший метод я пришел до сих пор, чтобы свести к минимуму эту проблему в ASP.NET неосновные веб-приложения должны импортировать (и правильно настроить) пакет веб-API в веб-приложение на основе MVC, поэтому я могу иметь лучшее из обоих миров:
Controllersдля представлений,ApiControllersдля сведения.для того чтобы сделать это, вам нужно сделать следующее:
- установите следующие пакеты Web API с помощью NuGet:
Microsoft.AspNet.WebApi.CoreиMicrosoft.AspNet.WebApi.WebHost.- добавьте один или несколько ApiControllers к вашему .
- добавить следующее 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 класса (или
Startup.csилиGlobal.asax.cs, в зависимости от того, используете ли вы OWIN Шаблон запуска или нет).Автозагрузка.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); // ... }глобальные.асакс.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) без сериализации.
однако, чтобы вернуть данные JSON в контроллерах MVC, мы установим возвращаемый тип результата действия в JsonResult и вызовем метод Json на нашем объекте, чтобы гарантировать, что он упакован в JSON.
довольно просто решить между ними: если вы пишете приложение на основе HTML web/internet/intranet - возможно, со случайным вызовом AJAX, возвращающим json здесь и там - придерживайтесь MVC / Controller. Если вы хотите предоставить управляемый данными/REST-ful интерфейс для системы, перейдите к WebAPI. Вы можете объединить оба, конечно, имея ApiController cater AJAX вызовы со страницы MVC. В основном контроллер используется для mvc и api-контроллер используется для отдыха- API вы можете использовать оба в том же программа как ваша потребность
Comments