WCF Web API 0.6.0を使用してHttpResponseMessage内でList<T>
またはIList<T>
のいずれかを返すことに問題があります。WCF Web APIのシリアル化の問題
私のシンプルなサービス契約は、次のとおりです。
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クラスには、次のとおりです:
[ServiceContract]
public interface IPersonService
{
[OperationContract]
[WebInvoke(UriTemplate = "people", Method = "GET")]
HttpResponseMessage<IList<Person>> LoadPeople();
}
実装です
[DataContract]
public class Person
{
public Person(string name)
{
Name = name;
}
[DataMember]
public string Name { get; set; }
}
しかし、私は、メソッドを呼び出したときに、I次の例外が発生します。
System.Runtime.Serialization.InvalidDataContractException:タイプ 'System.Net.Http.HttpResponseMessage
1[System.Collections.Generic.IList
' [Person]] 'はシリアル化できません。 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 ...
HttpResponseMessageでラップされたリストを返すのはなぜですか? HttpResponseMessageの代わりにを返すだけでいいですか?> –
Rajesh