我在使用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 ......
答案 0 :(得分:2)
不要在wcf方法中返回IList。返回用List包装的HttpResponseMessage怎么样?
[编辑]
第二次看问题不是IList,而是HttpResponseMessage类。它不可序列化。
答案 1 :(得分:1)
我使用IEnumerable执行相同的任务。它就像魅力......