【问题标题】:returning json datatable no data received返回json数据表未收到数据
【发布时间】:2023-03-15 06:43:01
【问题描述】:

我有一个REST 服务,它返回一个json 序列化的DataTable

当我向服务发出请求时,我没有收到任何数据(来自 chrome 的“未收到数据”),但是当我将返回类型更改为 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 对象?

【问题讨论】:

  • 这是因为您要序列化的“对象”是一个数据表,因此您在另一端得到一个数据表,而是填充对象列表并将其序列化,这通常是惯例。阅读stackoverflow.com/questions/16441880/how-to-return-json-object
  • WCF 默认不使用 Json.Net。要么使用this 将Json.Net 用作序列化器,要么返回System.ServiceModel.Channels.Message 并像现在一样用Json.Net 填充它。 (return WebOperationContext.Current.CreateTextResponse(serializeHere))
  • @Paul 我让它返回了一个列表并且它正在工作。谢谢。
  • 我也要试试你的建议@L.B
  • @L.B 效果很好,非常感谢。

标签: c# json wcf datatable


【解决方案1】:

我最终接受了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;
    }
}

【讨论】:

    猜你喜欢
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多