Проблема с сериализацией WCF Web API - PullRequest
0 голосов
/ 26 января 2012

У меня возникли проблемы с возвратом 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 ...

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Не возвращать IList в методе wcf.Как насчет возврата HttpResponseMessage, обернутого списком?

[Edit]

При втором взгляде проблема не в IList, а в классе HttpResponseMessage.И это не сериализуемо.

1 голос
/ 30 января 2012

Я использовал IEnumerable для той же задачи. Это работает как шарм ...

...