我有一个 WCF 服务,我想从中返回一个 DataTable。我知道这通常是一个备受争议的话题,至于返回 DataTables 是否是一种好的做法。让我们暂时搁置一下。
当我从头开始创建 DataTable 时,如下所示,没有任何问题。该表已创建、填充并返回给客户端,一切正常:
[DataContract]
public DataTable GetTbl()
{
DataTable tbl = new DataTable("testTbl");
for(int i=0;i<100;i++)
{
tbl.Columns.Add(i);
tbl.Rows.Add(new string[]{"testValue"});
}
return tbl;
}
但是,一旦我出去并点击数据库创建表,如下所示,我就会收到 CommunicationException“底层连接已关闭:连接意外关闭。”
[DataContract]
public DataTable GetTbl()
{
DataTable tbl = new DataTable("testTbl");
//Populate table with SQL query
return tbl;
}
该表正在服务器端正确填充。它比我循环并返回的测试表小得多,而且查询小而快 - 这里没有超时或大数据传输的问题。使用完全相同的函数和 DataContracts/ServiceContracts/BehaviorContracts。
为什么表格的填充方式会影响表格的成功返回?
最佳答案
对于任何有类似问题的人,我已经解决了我的问题。是好几倍。
- 正如 Darren 所建议和 Paul 支持的那样,需要扩大配置中的 Max..Size 属性。 SvcTraceViewer 实用程序有助于确定这一点,但它并不总是提供最有用的错误消息。
- 还显示,当服务引用在客户端更新时,配置有时不会正确更新(例如,更改服务器上的配置值并不总是在客户端正确更新。我不得不进去更改在我的调试过程中,在客户端和服务器端多次使用 Max..Size 属性)
要使 DataTable 可序列化,需要为其指定一个名称。默认构造函数没有给表命名,所以:
return new DataTable();
将不可序列化,同时:
return new DataTable("someName");
将根据作为参数传递的任何内容命名表。
请注意,可以随时通过将字符串分配给 DataTable 的
TableName
属性来为表命名。var table = new DataTable(); table.TableName = "someName";
希望这会对某人有所帮助。
关于c# - 在 WCF/.NET 中返回数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12702/