У меня возникли проблемы с возвратом List<T>
или IList<T>
в HttpResponseMessage с использованием WCF Web API 0.6.0.
Мой простой сервисный контракт:
[ServiceContract]
public interface IPersonService
{
[OperationContract]
[WebInvoke(UriTemplate = "people", Method = "GET")]
HttpResponseMessage<IList<Person>> LoadPeople();
}
Реализация:
public class PersonService : IPersonService
{
public HttpResponseMessage<IList<Person>> LoadPeople()
{
var people = new List<Person>();
people.Add(new Person("Bob"));
people.Add(new Person("Sally"));
people.Add(new Person("John"));
return new HttpResponseMessage<IList<Person>>(people);
}
}
И класс Person таков:
[DataContract]
public class Person
{
public Person(string name)
{
Name = name;
}
[DataMember]
public string Name { get; set; }
}
Но когда я вызываю метод, я получаю следующее исключение:
System.Runtime.Serialization.InvalidDataContractException: Тип 'System.Net.Http.HttpResponseMessage 1[System.Collections.Generic.IList
1 [Person]]' не может быть сериализован.Попробуйте пометить его атрибутом DataContractAttribute и пометить все его элементы, которые вы хотите сериализовать, атрибутом DataMemberAttribute.Если тип является коллекцией, попробуйте пометить его с помощью CollectionDataContractAttribute.Информацию о других поддерживаемых типах см. В документации Microsoft .NET Framework.
Очевидно, что существует проблема с сериализацией IList.В моем классе Person уже указаны атрибуты DataContract и DataMember, поэтому я немного прочитал и обнаружил, что нельзя сериализовать интерфейс.
Я попытался изменить тип коллекции с IList на List, но тот жеошибка все еще возвращается.
Я даже пытался создать класс PersonCollection и пометил его атрибутом CollectionDataContract, как рекомендовано:
[CollectionDataContract]
public class PersonCollection : List<Person>
{
}
Но это все равно не работает, точнота же ошибка вернулась.Читая еще немного, я обнаружил эту ошибку , которая помечена как закрытая (не исправит).
Кто-нибудь может помочь, пожалуйста, или предоставить подходящий альтернативный метод?Большое спасибо.
Обновление
После многих странных проблем я значительно реорганизовал свой код, и проблема, похоже, исчезла.Сейчас я возвращаю HttpResponseMessage, обертывающий IList, и он отлично работает.
Спасибо за всю помощь, но я верю, что, возможно, я искал Heisenbug ...