【发布时间】:2012-08-24 21:08:37
【问题描述】:
我正在使用 TCP/IP 协议在 Delphi XE2 中开发 DataSnap 项目,该协议需要将二进制数据流作为方法参数传递给服务器。我遇到的问题是流内容的大小限制似乎约为 32 KB。超出此限制,服务器接收到的流为空。如果我传递其他方法参数,它们会完好无损地到达,所以这似乎是参数级别的问题。
以下是 DataSnap 服务类的声明方式:
TDataSnapTestClient = class(TDSAdminClient)
private
FSendDataCommand: TDBXCommand;
public
constructor Create(ADBXConnection: TDBXConnection); overload;
constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload;
destructor Destroy; override;
procedure SendData(Data: TStream);
end;
至少根据 Jim Tierney 的文章,我使用的方法应该有效。也就是说,自 Delphi 2009 以来,显然发生了一些更改,破坏了 Jim Tierney 的示例代码。
DataSnap Server Method Stream Parameters
任何关于如何解决此问题的想法将不胜感激。
【问题讨论】:
-
我在调试器中跟踪了客户端代码,发现问题出在 TDBXRowBuffer.WriteBytes 中。看起来这是一个已知问题:qc.embarcadero.com/wc/qcmain.aspx?d=90995
-
您是仅在将数据推送到 DS 服务器时才看到问题,还是在拉取数据时也看到了问题?我通常使用
TStream从 DS 服务器中提取几个兆字节流。我使用 Ethereal 观察传输的数据包,它以 32k 块传输二进制数据,直到收到所有块。 -
仅供参考 - Embarcadero QC 90995 现已以“按设计”解决方案关闭。处理 DataSnap 流参数的官方正确方法是检查流 Size 属性。如果值为 -1,则需要读取流,直到 Read 方法返回零结果。感谢 James L. 指出这个问题的解决方案。