Разница между ApiController и контроллером в ASP.NET MVC

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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<Tweet> Get() {
    return Twitter.GetTweets();
  }
}

Ответ 3

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

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

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

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

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);
    // ...
}

Этот подход - вместе со своими плюсами и минусами - далее объясняется в следующем сообщении.

Ответ 4

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

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

Ответ 5

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