Разница между ApiController и controllerом в ASP.NET MVC

Я играл с бета-версией ASP.NET MVC 4, и теперь вижу два типа controllerов: ApiController и Controller .

Я немного смущен тем, в каких ситуациях я могу выбрать конкретного controllerа.

Например: если я хочу вернуть представление, я должен использовать ApiController или обычный Controller ? Я знаю, что WCF Web API теперь интегрирован с MVC.

Поскольку теперь мы можем использовать оба controllerа, кто-нибудь может указать, в каких ситуациях идти по соответствующему controllerу.

Используйте Controller для отображения ваших обычных представлений. Действие ApiController возвращает только данные, которые сериализуются и отправляются клиенту.

Ссылка здесь

Цитата:

Примечание. Если вы работали с ASP.NET MVC, то вы уже знакомы с controllerами. Они работают аналогично в Web API, но controllerы в Web API получают из classа ApiController вместо classа Controller. Первое существенное различие, которое вы заметите, заключается в том, что действия над controllerами Web API не возвращают представления, они возвращают данные.

ApiControllers специализируются на возвращении данных. Например, они заботятся о прозрачной сериализации данных в формате, запрошенном клиентом. Кроме того, они следуют по другой схеме маршрутизации по умолчанию (как в: сопоставление URL-адресов с действиями), предоставляя API REST-ful по соглашению.

Вы, вероятно, могли бы сделать что угодно, используя controller вместо ApiController с некоторым (?) Ручным кодированием. В конце концов, оба controllerа построены на основе ASP.NET. Но наличие REST-ful API сегодня является таким общим требованием, что WebAPI был создан для упрощения реализации такого API.

Достаточно просто решить, между двумя: если вы пишете приложение на основе Интернета / интернет / интрасети на базе HTML – возможно, при случайном вызове AJAX, возвращающем json здесь и там, – придерживайтесь MVC / Controller. Если вы хотите предоставить управляемый данными / REST-ful интерфейс для системы, перейдите в WebAPI. Вы можете комбинировать оба, конечно, с вызовами AJAX с ApiController caterpils с страницы MVC.

Чтобы привести пример реального мира: я сейчас работаю с ERP-системой, которая предоставляет API REST-ful своим сущностям. Для этого API WebAPI будет хорошим кандидатом. В то же время система ERP предоставляет веб-приложение с высоким AJAX-кодом, которое можно использовать для создания запросов для API REST-ful. Сам веб-приложение может быть реализовано как приложение MVC, используя WebAPI для извлечения метаданных и т. Д.

Что вы предпочитаете писать и поддерживать?

ASP.NET MVC

 public class TweetsController : Controller { // GET: /Tweets/ [HttpGet] public ActionResult Index() { return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet); } } 

Веб-API ASP.NET

 public class TweetsController : ApiController { // GET: /Api/Tweets/ public List Get() { return Twitter.GetTweets(); } } 

Мне нравится то, что MVC6 ASP.NET Core объединяет два шаблона в один, потому что мне часто нужно поддерживать оба мира. Хотя верно, что вы можете настроить любой стандартный MVC- Controller (и / или разработать собственные classы ActionResult ), чтобы действовать и вести себя точно так же, как ApiController , его может быть очень сложно поддерживать и тестировать: ApiController того, если методы controllerов возвращаются ActionResult смешанный с другими, возвращающими сырые / сериализованные / IHttpActionResult данные, может быть очень запутанным с точки зрения разработчика, особенно если вы не работаете в одиночку и должны заставить других разработчиков ускорить этот гибридный подход.

Лучший способ, с помощью которого я дошел до сих пор, чтобы свести к минимуму эту проблему в непрофильных веб-приложениях ASP.NET, заключается в том, чтобы импортировать (и правильно настроить) пакет веб-API в веб-приложение на основе MVC, поэтому я могу использовать как лучшие, так и worlds: Controllers for Views, ApiControllers для данных.

Для этого вам необходимо сделать следующее:

  • Установите следующие пакеты веб-API с помощью NuGet: Microsoft.AspNet.WebApi.Core и Microsoft.AspNet.WebApi.WebHost .
  • Добавьте один или несколько ApiControllers в папку /Controllers/ .
  • Добавьте следующий файл 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 } ); } } 

Наконец, вам необходимо зарегистрировать вышеуказанный class в своем classе Startup ( 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) без сериализации.

Однако, чтобы вернуть JSON Data в controllerах MVC, мы установим возвращаемый тип результата действия в JsonResult и вызовите метод Json на нашем объекте, чтобы убедиться, что он упакован в JSON.

Достаточно просто решить, между двумя: если вы пишете приложение на основе Интернета / интернет / интрасети на базе HTML – возможно, при случайном вызове AJAX, возвращающем json здесь и там, – придерживайтесь MVC / Controller. Если вы хотите предоставить управляемый данными / REST-ful интерфейс для системы, перейдите в WebAPI. Вы можете комбинировать оба, конечно, с вызовами AJAX с ApiController caterpils с страницы MVC. В основном controller используется для mvc, а api-controller используется для Rest-API, который вы можете использовать как в той же программе,

  • Сложный тип получает значение null в параметре ApiController
  • Как настроить controller webapi для multipart / form-data
  • Как установить cookie на HttpRequestMessage HttpClient?
  • Как использовать Container вместо ObjectFactory в StructureMap ServiceActivator?
  • Как я могу использовать JSON на веб-странице из источника ни с CORS, ни с JSONP?
  • WebAPI StreamContent vs PushStreamContent
  • Ошибка API-интерфейса Asp.Net: тип «ObjectContent`1» не смог сериализовать тело ответа для типа контента «application / xml»; кодировка = UTF-8'
  • Не удалось выполнить аутентификацию службы ASP.NET Web Api с помощью HttpClient
  • Доступ к Azure Emulator с другого устройства
  • Аутентификация пользователя в веб-интерфейсе ASP.NET
  • ASP.NET Core MVC: как получить необработанный JSON привязан к строке без типа?
  • Interesting Posts

    Как сохранить почту в .eml-файл с Outlook?

    Атрибут на интерфейсных элементах не работает

    Visual Studio, по-видимому, случайно использует американскую раскладку клавиатуры

    Как получить текущее время в Python

    Какой самый простой способ обнюхать данные трафика TCP в Linux?

    Как установить iptables, чтобы https://bing.com был заблокирован, но http://bing.com нет?

    Программно подключаться к сопряженному устройству Bluetooth

    Ошибка ASP.Net: «Тип« foo »существует как в« temp1.dll », так и в« temp2.dll »,

    Использовать компонент в себе рекурсивно для создания дерева

    Пользовательские ассемблеры сборки

    Вывод первого аргумента шаблона с другими параметрами шаблона по умолчанию

    Опция командной строки для открытия Chrome в новом окне и перемещение фокуса

    Каково обоснование наличия сопутствующих объектов в Scala?

    mac os x terminal batch rename

    В чем разница между «@» и «=» в области действия в AngularJS?

    Давайте будем гением компьютера.