Разница между 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-адресов с действиями), предоставляя REST-ful API по соглашению.

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

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

чтобы дать пример реального мира: в настоящее время я работаю с ERP-системой, которая предоставляет REST-ful API своим сущностям. Для этого 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);
  }
}

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 неосновные веб-приложения должны импортировать (и правильно настроить) пакет Web 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.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 / интернет / интрасеть-возможно, с случайным вызовом AJAX, возвращающим json здесь и там - придерживайтесь MVC/Controller. Если вы хотите предоставить системе интерфейс, управляемый данными/REST-ful, перейдите к WebAPI. Вы можете объединить оба, конечно, имея ApiController обслуживает AJAX-вызовы со страницы MVC. В основном контроллер используется для mvc, а api-контроллер - для Rest- API вы можете использовать оба в одном программа как ваша потребность