2014-03-05 47 views
3

我有一個REST服務,它返回一個json序列化DataTable返回json數據表沒有收到數據

當我做對服務的請求我沒有得到任何數據(「無數據receieved」從鍍鉻),但是當我改變返回類型爲string,並返回一個字符串,它是序列化DataTable,一切工作正常(除我必須解析字符串Json)。

//Doesn't Work 
[OperationContract] 
[WebGet(ResponseFormat = WebMessageFormat.Json, 
     UriTemplate = "data")] 
public DataTable LoadData2() { 

    return JsonQueryDatabase2(VCAPSProduction); 
} 

// Works, but returns a json string 
[OperationContract] 
[WebGet(ResponseFormat = WebMessageFormat.Json, 
     UriTemplate = "data")] 
public string LoadData2() { 

    return JsonConvert.SerializeObject(JsonQueryDatabase2(connString)); 
} 

如何讓我的服務返回使用DataTable的Json對象?

+1

這是因爲「對象」你是連載是一個數據表,因此你在另一端的數據表,填充對象的列表,而不是和那個連載,通常是約定。閱讀http://stackoverflow.com/questions/16441880/how-to-return-json-object –

+1

默認情況下,WCF不使用Json.Net。可以使用[this](http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/03/wcf-extensibility-message-formatters.aspx)來使用Json.Net作爲serialiazer,或者返回' System.ServiceModel.Channels.Message'並像現在這樣用Json.Net填充它。 ('返回WebOperationContext.Current.CreateTextResponse(serializeHere)') –

+1

@Paul我已經得到它返回一個列表,它的工作。謝謝。 – kschieck

回答

2

我結束了與L.B的建議。

using Newtonsoft.Json; // JsonConvert.SerializeObject 

...

[OperationContract] 
[WebGet(ResponseFormat = WebMessageFormat.Json, 
     UriTemplate = "data?limit={limit}")] 
public System.ServiceModel.Channels.Message LoadData_Limited(int limit) { 

    if (limit <= 0) { return null; } 

    string query = ...; 

    try { 

     ... 

     //Return data from query 
     DataTable dt = QueryDatabase(connString, query, parameters); 
     string serialized = JsonConvert.SerializeObject(dt); 
     return WebOperationContext.Current.CreateTextResponse(serialized); 

    } catch { 
     return null; 
    } 
}