2

我用 Delphi XE2 构建了一个 DataSnap 服务器,它实现了TDSHTTPService. 当入站请求进来时,TIdIOHandler.InitComponent在线程中调用,然后将执行交给 in 调用的方法TServerMethods。我在服务器中没有任何 Indy 组件,因此 DataSnap 在后台使用 Indy 10。

.InitComponent()将 IO 处理程序的最大行长度设置为硬编码值 ( FMaxLineLength := IdMaxLineLengthDefault;),即16384。我找不到增加价值的方法。我什至尝试将IdIOHandler 单元复制到项目文件夹并更改常量值。但它仍然会从 Indy 10 构建中获取IdIOHandler.dcu,并忽略我的项目文件夹中复制的文件。我还尝试向TIdIOHandlerStream服务器项目添加一个组件并将其设置MaxLineLength为无济于事。

  • 计划 A =正确设置MaxLineLengthDataSnap 服务器中的值。
  • 计划 B = 以某种方式将修改后的IdIOHandler.pas文件编译到我的项目中。

这些都可能吗?我已经为此工作了几个小时,在我的所有搜索中都找不到类似的东西,而且似乎无法通过实验取得任何进展。

4

2 回答 2

1

在 Delphi XE3 中重新编译所有 Indy 包后,将 IdMaxLineLengthDefault 常量更改为 512 * 1024,然后按预期工作,我开始寻找解决此问题的最简单方法。所以,我发现这是一个简单的解决方法。

您可以为 DataSnap REST Server 项目的主单元中使用的 TIdHTTPWebBrokerBridge 对象的 OnContextCreated 事件实现一个过程。在这种情况下,将收到 AContext 对象,该对象是为对 DataSnap 服务器的每个请求创建的。因此,在此过程的代码中,您只需覆盖此属性的默认值,如下所示:

procedure TForm1.FormCreate(Sender: TObject);
begin
  FServer := TIdHTTPWebBrokerBridge.Create(Self);

  {Here you assign the new procedure for this event}
  FServer.OnContextCreated:= OnContextCreated; 
end;

procedure TForm1.OnContextCreated(AContext: TIdContext);
begin
   AContext.Connection.IOHandler.MaxLineLength:= 512*1024 {or whatever value you need);
end;
于 2013-07-25T14:42:28.453 回答
0

没有删除 Indy 10 的 Delphi XE2 安装并下载源代码,调整常量值并永远编译/维护我自己的构建......,我解决了这个问题。

我在 DataSnap 服务器中创建了一个附加方法,以便我可以通过调用第一个方法在数据库中创建一条记录,然后通过将其余数据一次传递给第二个方法 16k 以增量方式流式传输 - 缓冲它在 DataSnap 服务器中,直到收到所有部分。然后,我使用来自 DataSnap 服务器的完全缓冲值更新数据库中的记录。

也许不是最有效的解决方案,但它可以工作并且可以根据需要进行扩展。

于 2012-09-07T05:54:09.337 回答