2012-01-26 20 views
0

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 ...

+0

HttpResponseMessageでラップされたリストを返すのはなぜですか? HttpResponseMessageの代わりにを返すだけでいいですか?> – Rajesh

答えて

2

を見てきたことが信じているWCFの方法でのIListを返しません。 ListでラップされたHttpResponseMessageを返すのはどうですか?

[編集]

二見た目の問題では、それがHttpResponseMessageクラスであり、IListのではありません。そして、それは直列化できません。

+0

HttpResponseMessageのList とPersonCollectionの両方を返そうとしましたが、どちらも同じエラーが発生します。 –

1

IEnumerableを同じタスクに使用しました。それは魅力のように働く...