Разница между 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 вы можете использовать как в той же программе, что и ваша потребность