Разница между ApiController и Controller в ASP.NET MVC - PullRequest
312 голосов
/ 29 февраля 2012

Я играл с ASP.NET MVC 4 beta и теперь вижу два типа контроллеров: ApiController и Controller.

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

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

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

Ответы [ 7 ]

324 голосов
/ 29 февраля 2012

Используйте контроллер для отображения ваших обычных представлений.Действие 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.Конечно, вы можете комбинировать и то и другое, имея вызовы AJAX ApiController cater со страницы MVC.

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

181 голосов
/ 30 апреля 2013

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

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();
  }
}
27 голосов
/ 11 августа 2016

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

Лучший способ, которым я до сих пор занимался, чтобы минимизировать эту проблему в неосновных веб-приложениях ASP.NET, - это импортировать (и правильно настроить) пакет Web API в MVC.на основе веб-приложения, поэтому у меня может быть лучшее из обоих миров: Controllers для представлений, 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 }
        );
    }
}

Наконец, вам нужно зарегистрировать вышеуказанный класс в 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);
    // ...
}

Этот подход - вместе с его плюсами и минусами - более подробно объясняется в этом посте , который я написал в своем блоге.

1 голос
/ 20 февраля 2018

Каждый метод в Web API будет возвращать данные (JSON) без сериализации.

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

0 голосов
/ 03 июня 2019

Это почти одно, но, это другое Имя, Цель использования и Прозрачность между MVC и API.

0 голосов
/ 21 февраля 2019

Основное отличие состоит в том, что Web API - это сервис для любого клиента, любых устройств, а MVC Controller обслуживает только своего клиента. То же самое, потому что это платформа MVC.

0 голосов
/ 24 марта 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...