Использование WebAPI или MVC для возврата JSON в ASP.NET

139

Я создаю приложение ASP.NET MVC, в котором много клиентских скриптов, оно будет использовать JSON и jQuery для управления DOM.

Я понимаю, как Web API контроллера и MVC контроллер может вернуть JSON.

Учитывая мой сценарий, следует ли мне использовать контроллер веб-API или контроллер MVC ?

Нил Пун
источник
1
Важно отметить, что этот вопрос специфичен для определенного контекста: автор хочет знать, какой контроллер использовать, если должен быть возвращен ТОЛЬКО json. REST API позволяет различное форматирование мультимедиа в зависимости от согласования содержимого (например, принять xml, принять json). В этом случае контроллер WebAPI - ваш лучший вариант
Sentinel

Ответы:

157

Контроллеры веб-API могут быть созданы и размещены в любом приложении ASP.NET, а не только в приложениях MVC. Таким образом, очевидной причиной создания веб-API является отсутствие у вас внешнего интерфейса MVC (например, классические веб-службы RESTful, размещенные вашей компанией / организацией).

Контроллеры MVC обычно полагаются на MVC Framework, если вы посмотрите на шаблоны по умолчанию и большую часть работы, выполняемой сообществом и вашими коллегами, вы заметите, что почти все контроллеры MVC реализованы с учетом представления.

Лично я использую контроллеры MVC, когда намереваюсь ответить с помощью View (), и я буду использовать веб-API для всего, что не зависит от конкретного представления.

Конечно, есть предостережения, но в целом, если вам не требуется поведение привязки модели для MVC, ваша служба ориентирована на данные, а операции - на основе данных (например, операции CRUD), тогда вам, вероятно, понадобится 'Контроллер веб-API 'вместо' Контроллер представления модели '. И наоборот, если ваши операции ориентированы на представление (например, доставляют пользователю страницу администратора) или вам требуется привязка модели MVC для генерации «частичных данных ajax» (что очень маловероятно), тогда вам потребуется контроллер MVC.

Лично я использую контроллеры веб-API для управления клиентами RESTful на основе JSON, я использую контроллеры MVC для обработки базовой маршрутизации браузера и доставки SPA.

Шон Уилсон
источник
32

WebAPI предназначен для создания API. Если вы хотите, чтобы кто-то мог использовать ваш API в XML, JSON и т. Д., Вы можете создать веб-api.

В вашем случае вам нужно только поговорить с клиентом в JSON.

Даже если ваш веб-сайт в основном основан на клиентском скрипте, вы все равно будете использовать контроллер ASP.NET MVC, верно? И поскольку вы, возможно, уже логически разделили свои контроллеры на основе сущностей, имеет смысл добавить в него эти методы обслуживания json, а не создавать другой класс специально для веб-API.

Поэтому для вашей конкретной ситуации (если я правильно понимаю) я бы остановился на контроллерах.

Мухаммад Хасан Хан
источник
Спасибо, есть ли разница в том, как мы создаем WebAPI vs Controller?
Нил Пун
1
@flybyte да, вам нужно унаследовать от ApiController, см. asp.net/web-api/overview/getting-started-with-aspnet-web-api/…
Мухаммад Хасан Хан,
5
Web Api может использовать JSON, а также другие перечисленные вами методы. Контроллеры нельзя (аккуратно) превратить в API, поэтому, учитывая, что у пользователя есть дальновидность, я бы предложил использовать более масштабируемое / гибкое решение. Это не похоже на старые школьные службы WCF, веб-api обычно одновременно мощный и гибкий. Поэтому, хотя вам нужны только простые сценарии, они не мешают вам. НО у вас есть сила, если она вам понадобится,
Стив
8

Ответ сводится к разделению задач, ускорению создания сервисов и использованию условностей, а не конфигурации.

Основная ответственность контроллеров - работать в качестве координатора между представлением и вашей моделью, но в то время как основная ответственность API - работа с данными. В случае с соглашениями API очень легко выполнять операции CRUD. Ниже показано соответствие между операцией CRUD и действиями HTTP.

  • Читается
  • POST: Создать
  • PUT: Обновить
  • УДАЛИТЬ: Удалить

Таким образом, с API вам не нужно создавать отдельные действия и приписывать их действиям HTTP.

Крис
источник
0

Единственное, что меня беспокоит в отношении ApiController, это то, что он основан на сайте, а не в области. На одном сайте может быть только одна подпапка apicontroller, в которой вы можете назвать свои методы контроллера. Есть ситуации, когда вы можете захотеть дублировать имя контроллера в разных областях:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

Я помню, что для этого есть несколько настроек кода, но по умолчанию это не работает.

Рамон Чан
источник
это похоже на комментарий, а не на ответ.
Дилан Хейс
Не понимайте, что вы говорите. Если вы назвали контроллер Area1XController, вы можете сделать: domain.com/Area1X/1, создать контроллер: Area2XController, а затем получить к нему доступ с помощью: domain.com/Area2X/1. Большой вопрос в том, почему вы все равно хотите это сделать. Название области абстрактное, оно ничего не говорит пользователю. Если у вас, скажем, 4 области, лучше использовать для нее название функционального назначения.
Херман Ван Дер Блом
0

Я согласен с ответом Шона Уилсона (верхний ответ), но не уверен, почему, поскольку я немного смущен и все еще пытаюсь понять следующее (возможно, неправильное) предчувствие -

  • Используйте WebAPI Controller для доставки данных JSON клиенту, чтобы клиент мог обрабатывать манипуляции с представлением. Этот процесс НЕ требует представления, а скорее просто ответа на то, что называется методом (например, запрос javascript), чтобы клиент мог обрабатывать любые манипуляции на стороне клиента.
  • Используйте контроллер MVC, когда вам нужно использовать данные для управления представлением во время или сразу после page_load (т.е. не для приложений SPA).

Видите ли, я просто не знаю, почему я здесь неправ, и меня смущает, потому что в последней строке ответа Шона говорится: «Я использую контроллеры MVC для обработки базовой маршрутизации браузера и доставки SPA». - возможно, я не совсем понимаю, что такое спокойный клиент, когда предполагал, что это может быть метод JavaScript, который получает ответ в форме JSON. это ближайший пост в Stackoverflow, который был удаленно связан с ответом на мой вопрос, поэтому я отвечаю на этот пост вместо того, чтобы, возможно, дублировать вопросы.

РХ Торн
источник
« Используйте контроллер MVC для доставки представления », вы можете обернуть SPA в части MVC для композиции в представлении. Разработчики ASP.NET MVC должны понимать эту концепцию. Вы можете использовать обычные средства Razor + ASP.NET во время создания представления (например, обработка на стороне сервера) для визуализации HTML + JS для клиента. Проблема, с которой столкнутся здесь многие разработчики, заключается в том, что статические файлы HTML + JS - не то, что делает SPA SPA. иногда контент должен быть динамичным и специфичным для пользователя, но все фреймворки склонны отвлекать от этого факта. «SPA» и «MVC» не исключают друг друга.
Шон Уилсон
0

В этом случае я бы порекомендовал WebApi, поскольку он идеально подходит для передачи таких данных на основе запросов Javascript. Обычно я разрабатываю свои контроллеры WebApi так, чтобы они возвращали дружественный объект JSON, который затем можно было легко проанализировать с помощью моего Javascript.

Единственный реальный момент, когда вы захотите использовать действие на контроллере MVC для такого рода вещей, - это если вы хотите сгенерировать некоторый HTML и заменить сегменты вашей страницы вызовами Javascript.

Например:

У вас есть JQuery UI Datepicker, который при выборе генерирует список переключателей, которые представляют события в выбранный день.

В этом сценарии вы можете использовать WebApi для возврата некоторого количества JSON, а затем сгенерировать необходимый HTML с помощью Javascript, но, как правило, создание большого количества HTML с использованием Javascript - плохая практика. Было бы намного лучше, если C # создаст HTML, а затем вернет его через частичное представление, так как таким образом вы с меньшей вероятностью столкнетесь с ошибками при синтаксическом анализе Javascript. Не говоря уже о том, что это упрощает написание HTML.

Jezzipin
источник