2014-03-05 50 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; 
    } 
}