Разница между 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