Это действительно зависит от того, что будет использовать ваш веб-сервис.
Например: jQuery хорошо использует JsonResults, потому что я могу возвращать сложные объекты (с коллекциями, массивами, вложенными объектами и т. Д.) Из действия и иметь возможность десериализации jQuery обратно в объект javascript для использования в браузере клиентов. Конечно, вы теряете безопасность типов в процессе сериализации, но это вполне ожидаемо в большинстве веб-сервисов на основе REST / SOAP. Если вам действительно нужна безопасность типов для потребляющего приложения, придерживайтесь WCF (или подобного).
Я бы просто создал флаг, чтобы вернуть действие как Json. Я заметил, что несколько сайтов делают это таким образом. Скажем, у вас есть это действие:
public ActionResult GetPeople()
{
IList<Person> result = svc.GetPeople();
return View(result);
}
.. результат этого действия обычно отображается в некотором представлении. Это здорово, но если вы хотите использовать действие в качестве веб-службы, вы можете просто изменить его на следующее:
public ActionResult GetPeople(string ajax)
{
IList<Person> result = svc.GetPeople();
if (Convert.ToBoolean(ajax))
return Json(result);
else
return View(result);
}
.. так что если ваше приложение-потребитель не возражало против сериализованного Json, то вместо того, чтобы вызывать GET-запрос, подобный этому http://domain.com/controller/GetPeople
(как бы браузер получал View), вы просто добавили бы флаг ajax, например, http://domain.com/controller/GetPeople?ajax=true
вернуть Json. Более подходящим флагом может быть «json» вместо «ajax» - «ajax» является распространенным, потому что этот метод используется для поддержки браузеров нижнего уровня для действий, которые могут вызываться с помощью ajax.
Я некоторое время думал о том, чтобы добавить это в мое приложение mvc, но мне не нравится идея модифицировать каждое действие с этим флагом и добавлять больше операторов if. Моя идея состоит в том, чтобы создать пользовательский атрибут для украшения действий, для которых вы хотите эту функциональность, и атрибут динамически добавляет дополнительный флаг и условно возвращает данные модели в виде Json, а не то, что было изначально указано. Попробуй.