我有一个 WCF 服务,我想从中返回一个数据表。我知道,就返回 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..在我的调试过程中,在客户端和服务器端多次调整属性大小)
-
为了使 DataTable 可序列化,需要为其指定一个名称。默认构造函数不会给表命名,因此:
return new DataTable();
将不可序列化,同时:
return new DataTable("someName");
将为表命名任何作为参数传递的内容。
请注意,可以随时通过将字符串分配给表来给表命名。TableName
数据表的属性。
var table = new DataTable();
table.TableName = "someName";
希望这会对某人有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)