如何从 .Net Web 服务返回 DataTable?

Posted

技术标签:

【中文标题】如何从 .Net Web 服务返回 DataTable?【英文标题】:How to return a DataTable from .Net Web Service? 【发布时间】: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;

【问题讨论】:

【参考方案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
;

【讨论】:

以上是关于如何从 .Net Web 服务返回 DataTable?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ASP.NET Web 服务生成 JSONP 以进行跨域调用?

从 iOS 上的 .net Web 服务获取数据

从 .NET Web 服务方法向 Javascript 客户端返回错误条件

如何在 Web 服务 asp.net 中返回 linq to sql 查询结果?

如何在 asp.net 中制作 json web 服务?

如何从 ASP.net 5 web api 返回文件