如何从 .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 以进行跨域调用?
从 .NET Web 服务方法向 Javascript 客户端返回错误条件