c# - 在 WCF/.NET 中返回数据表

标签 c# .net wcf web-services datatable

我有一个 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/

相关文章:

c# - ISomeInterface referenceVariable = ClassThatImplementsIt

c# - UpdateProgress 不会在 UpdatePanel 内的每个 PostBack 控件上触发

c# - Windows Phone 8.1 应用构建中缺少 WMAppManifest.xml

c# - ORA-21500 : internal error code, 参数 : [%s], [%s]、[%s]、[%s]、[%s]、[%s]、[%s]、[%s]

c# - NAT、wcf、双工通信……需要一些见识

c# - WCF Web 服务中的 RabbitMQ、模型使用和性能

c# - ASP.NET Core 3.0 身份不向我的浏览器添加任何身份验证数据

c# - ASP.NET C# 在gridview记录中显示按钮

.net - 如何使用 ng-Flow 在 ASP.NET 中分块上传文件

http - CORS请求预检请求,以用户代码结尾