【问题标题】:How to return a DataTable from .Net Web Service?如何从 .Net Web 服务返回 DataTable?
【发布时间】:2010-10-28 06:47:16
【问题描述】:

我已经能够从为 .Net 2.0 设置的 Web 服务返回 HashTable,但该服务无法以 JSON 格式重新调整 DataTable。我不断收到以下错误:“序列化对象时检测到循环引用”。有什么建议吗?

 [WebMethod(EnableSession = true) ]
public DataTable getSavedAddresses()
{
    DataTable dt = new DataTable();
    if (Session["ClientID"] != null)
    {
        int clientId = Convert.ToInt32(Session["ClientID"]);
        dt = Address.GetClientShippingAddresses(clientId);
    }
    return dt;

}

【问题讨论】:

    标签: .net web-services json datatable


    【解决方案1】:

    循环引用很可能是因为DataTable 有一个Columns 属性,而每个DataColumn 对象都有一个Table 属性。

    this blog post by Rick Strahl 中的信息或许对你有所帮助。

    【讨论】:

    • 我想我会尝试使用 XML。
    • 我认为这个答案表明需要自定义序列化程序。这就是 Rick Strahl 在博文中所做的,首先使用 JSON.NET,然后使用内置的 JavaScriptSerializer 库。
    【解决方案2】:

    只是快速重新访问这个老问题...... 我是这样做的:

    var header = datatable.Columns.Cast<DataColumn>().Select(r => new KeyValuePair<string, object>(r.ColumnName, r.DataType.Name));
    var data = datatable.Select().AsEnumerable()
        .Select(r => r.Table.Columns.Cast<DataColumn>()
            .Select(c => new KeyValuePair<string, object>(c.ColumnName, r[c.Ordinal] is DBNull ? null : r[c.Ordinal] )
        ).ToDictionary(z=>z.Key,z=>z.Value)
    );
    
    return new DatatableRequestResponse
    {
        data = data,
        header = header
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多