Различия в согласовании содержимого между коллекциями и отдельными значениями в MVC 4?

Я использую новый MVC4 ApiController для создания интерфейса поиска; что-то вроде этого:

public IEnumerable<RecordSummaryType> Get( ... )
{
    var list = MyService.GiveMeTheList( ... );
    return list;
}

public SingleRecordDetailType Get(long id)
{
    var result = MyService.GiveMeASingleValue(id);
    return result;
}

По какой-то причине в этом случае вызов IEnumerable учитывает согласование содержимого — т. е. когда я передаю application/xml в заголовках принятия запроса, он возвращает XML, а когда я передаю application/json, он возвращает JSON — но только вызов SingleRecordType возвращает JSON, даже если вы запрашиваете XML.

Итак, мой вопрос: есть ли различия в том, как MVC 4 обрабатывает коллекции по типам с одним значением? Или, что более вероятно, есть ли в MVC ловушки, с помощью которых можно непреднамеренно отключить согласование содержимого для определенных вызовов. ?


person Brandon Linton    schedule 13.03.2012    source источник


Ответы (1)


Это зависит от того, можно ли сериализовать SingleRecordDetailType с помощью XmlSerializer. XmlSerializer — это средство форматирования XML по умолчанию в веб-API ASP.NET, прочитайте здесь чтобы узнать больше о его ограничениях.

Если веб-API не может сериализовать ответ с помощью запрошенного модуля форматирования, он будет использовать первый модуль форматирования в списке, способный сериализовать ответ (в большинстве случаев это модуль форматирования JSON).

В качестве решения вы можете изменить класс yoru, чтобы его можно было сериализовать с помощью XmlSerializer, или перенастроить средство форматирования XML для использования сериализатора контрактов данных, задав для свойства UseDataContractSerialzier значение true.

person tpeczek    schedule 13.03.2012
comment
Это определенно было так — я пропустил некоторые IList в иерархии объектов, но предоставление правильного типа реализации сделало XmlSerializer счастливым. Такое поведение полностью имеет смысл, просто я понятия не имел, как с этим обращались. Спасибо! - person Brandon Linton; 13.03.2012