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

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

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

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

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

13 ответов

Решение

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

вот ссылка

Цитата:

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

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

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

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

Чтобы привести пример из реальной жизни: в настоящее время я работаю с ERP-системой, которая предоставляет API-интерфейс REST для своих объектов. Для этого 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 Core MVC6 объединил два шаблона в один, потому что мне часто нужно поддерживать оба мира. Хотя это правда, что вы можете настроить любой стандартный MVC Controller (и / или разработать свой собственный ActionResult классы) действовать и вести себя так же, как ApiControllerможет быть очень сложно поддерживать и тестировать: кроме того, возвращая методы Controllers ActionResult смешанный с другими, возвращающими сырой / сериализованныйIHttpActionResult Данные могут быть очень запутанными с точки зрения разработчика, особенно если вы работаете не в одиночку и вам необходимо ускорить работу других разработчиков с помощью этого гибридного подхода.

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

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

Быстрый и короткий ответ

Если вы хотите вернуть представление, вы должны быть в "Контроллере".

Обычный контроллер - ASP.NET MVC: вы имеете дело с обычным "контроллером", если вы находитесь в веб-приложении ASP.net. Вы можете создать Controller-Actions и можете вернуть Views().

Контроллер ApiController: вы создаете ApiController при разработке API REST ASP.net. вы не можете вернуть представления (хотя вы можете вернуть Json/Data для HTML в виде строки). Эти API-интерфейсы считаются серверными, и их функции вызываются для возврата данных, а не представления.

Пожалуйста, не забудьте отметить это как ответ, будьте осторожны

Подробнее здесь

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

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

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

Asp.Net MVC используется для создания веб-приложений, которые возвращают как представления, так и данные, но Asp.Net Web API используется для создания полноценных HTTP-сервисов с легким и простым способом, который возвращает только данные, а не представление. Веб-API помогает создавать REST-сервисы поверх MVC, возвращая данные только в формате JSON с использованием JsonResult.

Контроллер веб-API:

      //POST - Insert Data
    public IHttpActionResult PostNewCustomer(CustomerViewModel customer)
    {
        if (!ModelState.IsValid)
            return BadRequest("Invalid data. Please recheck1");
        using (var x=new WebAPIDemo_DBEntities())
        {
            x.customers.Add(new customer()
            {
                name = customer.Name,
                email = customer.Email,
                address = customer.Address,
                phone = customer.Phone
            });
            x.SaveChanges();
        }
        return Ok();

Контроллер MVC:

          [HttpPost]
    public ActionResult Edit(CustomerMvcModel customer)
    {
        HttpResponseMessage response = GlobalVariables.webapiclient.PutAsJsonAsync("Customer/" + customer.Id, customer).Result;
        TempData["SuccessMessage"] = "Updated Successfully";
        return RedirectToAction("Index");
    }

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

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

Asp.Net MVC используется для создания веб-приложений, которые возвращают как представления, так и данные, но Asp.Net Web API используется для создания полноценных HTTP-служб с легким и простым способом, который возвращает только данные, а не представление. Веб-API помогает создавать REST-сервисы поверх MVC, возвращая данные только в формате JSON с использованием JsonResult. Пример из моего проекта:Web Api Controller://POST - Insert Datapublic IHttpActionResult PostNewCustomer(CustomerViewModel customer){if (!ModelState.IsValid)return BadRequest("Invalid data. Please recheck1"); используя (var x=new WebAPIDemo_DBEntities()){x.customers.Add(new customer(){name = customer.Name,email = customer.Email,address = customer.Address,phone = customer.Phone});x.SaveChanges();}return Ok(); Контроллер MVC:

          [HttpPost]
    public ActionResult Edit(CustomerMvcModel customer)
    {
        HttpResponseMessage response = GlobalVariables.webapiclient.PutAsJsonAsync("Customer/" + customer.Id, customer).Result;
        TempData["SuccessMessage"] = "Updated Successfully";
        return RedirectToAction("Index");
    }

Asp.Net MVC используется для создания веб-приложений, которые возвращают как представления, так и данные, но Asp.Net Web API используется для создания полноценных HTTP-сервисов с легким и простым способом, который возвращает только данные, а не представление. Веб-API помогает создавать REST-сервисы поверх MVC, возвращая данные только в формате JSON с использованием JsonResult.

Контроллер веб-API: //POST - Вставить данные общедоступные IHttpActionResult PostNewCustomer (CustomerViewModel customer) {if (! ModelState.IsValid) return BadRequest("Недействительные данные. Пожалуйста, проверьте1"); используя (var x=new WebAPIDemo_DBEntities()) {x.customers.Add(new customer() {name = customer.Name, email = customer.Email, address = customer.Address, phone = customer.Phone}); x.SaveChanges(); } return Ok(); Контроллер MVC:

      [HttpPost]
public ActionResult Edit(CustomerMvcModel customer)
{
    HttpResponseMessage response = GlobalVariables.webapiclient.PutAsJsonAsync("Customer/" + customer.Id, customer).Result;
    TempData["SuccessMessage"] = "Updated Successfully";
    return RedirectToAction("Index");
}

Если вы создадите новое веб-приложение в последней версии фреймворка 4.7.2, вы оба настроите их по умолчанию и сможете построить свое приложение на этом

В Asp.net Core 3+ Vesrion

Контроллер: если вы хотите вернуть что-либо, связанное с IActionResult & Data, выберите контроллер контроллера.

ApiController: используется как атрибут / обозначение в контроллере API. Это наследует класс ControllerBase

ControllerBase: если вы хотите вернуть данные, используйте только класс ControllerBase

Другие вопросы по тегам