2010-12-06 21 views
1

私はEntityフレームワークのPOCOクラスに基づいた簡単なプロトタイプWCFサービスを用意しています。応答形式を指定せずに公開されたメソッドの1つを実行すると、期待されるデータがXML形式でブラウザに返されます。しかし、私が "ResponseFormat = WebMessageFormat.Json"を指定すると、ブラウザにデータは返されません。私がFiddlerを使って何が起こっているのかをもっと調べると、ブラウザへの応答は "ReadResponse()failed:"というメッセージが表示されます。ここでWCFサービス - JSON - 返されないデータ

は、サービス契約です:

[ServiceContract] 
public interface ITimeService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "/Customer?ID={customerID}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    Customer GetCustomer(string customerID); 

    [OperationContract] 
    [WebGet(UriTemplate = "/Customers", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    List<Customer> GetCustomers(); 

    [OperationContract] 
    [WebGet(UriTemplate = "/Tasks/?CustomerID={customerID}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    List<Task> GetTasks(string customerID); 

} 

と実装:

public Customer GetCustomer(string customerID) 
    { 
     var ID = new Guid(customerID); 
     var context = new PinPointTimeEntities(); 
     var customer = context.Customers.Include("TimePeriods").Include("Tasks").Where(c => c.ID == ID).SingleOrDefault<Customer>(); 
     return customer; 
    } 

    public List<Customer> GetCustomers() 
    { 
     var context = new PinPointTimeEntities(); 
     var customers = context.Customers.ToList(); 
     return customers; 
    } 

    public List<Task> GetTasks(string customerID) 
    { 
     var ID = new Guid(customerID); 
     var context = new PinPointTimeEntities(); 
     var tasks = context.Tasks.Include("TimePeriods").Where(c => c.CustomerID == ID).ToList(); 
     return tasks; 
    } 

ノー成功と示唆したソリューションの数を試みました。私はそれが簡単な設定か必要なものだと思います。データがjson形式で正常に返されるためには、何が必要ですか?

+0

サービス契約または作業中の方法を投稿することはできますか?あなたはまた、そのサービスメソッドの実装を投稿できますか? –

答えて

1

この問題は自己参照クラスに関連していると私は考えています。上記のシナリオとDataContractJsonSerializerを使用してWindows Phone上のIsolated Storageにデータを格納しようとすると、JSONは循環参照でクラスをシリアライズすることはできないようです。

0

私はあなたのCustomerはシリアライズではないからだと信じているこの質問はすでに回答されているが、知っている...

。これを修正するのは簡単ですが、Customerクラスと[DataMember]タグに[DataContract]]タグを(公開する)データフィールド(シリアル化する必要がある)に追加するだけで、datacontractを作成するだけです。

[DataContract] 
public class Customer { 
    ... 

    [DataMember] 
    public int CustomerID; // this field will show up in the json serialization 

    public string CustomerSIN; // this field will not 

    ... 
} 
0

私はJSONにデータセットから、それを変換しながら、私のWCFサービスが適切にJSONをフォーマットしていなかった、同じ問題がありました。

using System.ServiceModel.Channels; 
using System.ServiceModel.Web; 

dsDataは、戻り値の型になります私のデータセット

String JString = Newtonsoft.Json.JsonConvert.SerializeObject(dsData); 
return WebOperationContext.Current.CreateTextResponse(JString, "application/json;charset=utf-8", System.Text.Encoding.UTF8); 

と「メッセージ」である:私はそれが次のソリューションを使用して作業しました。

関連する問題