WCF Web API序列化问题

时间:2012-01-26 11:58:47

标签: .net wcf serialization datacontract

我在使用WCF Web API 0.6.0在HttpResponseMessage中返回List<T>IList<T>时遇到了一些问题。

我的简单服务合同是:

[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:键入&#39; System.Net.Http.HttpResponseMessage 1[System.Collections.Generic.IList 1 [Person]]&#39;无法序列化。请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员。如果类型是集合,请考虑使用CollectionDataContractAttribute对其进行标记。有关其他受支持的类型,请参阅Microsoft .NET Framework文档。

  

显然,序列化IList存在问题。我的Person类已经指定了DataContract和DataMember属性,所以我读了一下,发现你不能序列化一个接口。

我尝试将集合的类型从IList更改为List但仍返回相同的错误。

我甚至尝试创建一个PersonCollection类,并按照建议将其标记为CollectionDataContract属性:

[CollectionDataContract]
public class PersonCollection : List<Person>
{
}

但这仍然无法正常工作,返回的错误完全相同。阅读更多我发现this bug被标记为已关闭(不会修复)。

任何人都可以提供帮助,或提供合适的替代方法吗?非常感谢。

更新

在遇到很多奇怪的问题之后,我重构了我的代码,问题似乎已经消失了。我现在正在返回一个包装IList的HttpResponseMessage,它运行正常。

感谢您的帮助,但我相信我可能一直在关注Heisenbug ......

2 个答案:

答案 0 :(得分:2)

不要在wcf方法中返回IList。返回用List包装的HttpResponseMessage怎么样?

[编辑]

第二次看问题不是IList,而是HttpResponseMessage类。它不可序列化。

答案 1 :(得分:1)

我使用IEnumerable执行相同的任务。它就像魅力......