DataSnap将入站请求限制为16k

时间:2012-09-05 20:17:03

标签: delphi delphi-xe2 indy datasnap indy10

我使用实现TDSHTTPService的Delphi XE2构建了一个DataSnap服务器。当入站请求进入时,在执行被传递给TIdIOHandler.InitComponent中调用的方法之前,在线程中调用TServerMethods。我在服务器中没有任何Indy组件,因此DataSnap在引擎盖下使用Indy 10。

.InitComponent() 将IO处理程序的最大行长度设置为硬编码值(FMaxLineLength := IdMaxLineLengthDefault;), 16384 < / em>的。我找不到增加价值的方法。我甚至尝试将 IdIOHandler Unit 复制到项目文件夹并更改常量值。但它仍然从Indy 10版本中获取 IdIOHandler.dcu ,并忽略我项目文件夹中的复制文件。我还尝试将TIdIOHandlerStream组件添加到服务器项目并将其MaxLineLength设置为无效。

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

这些都可能吗?我一直在研究这个问题几个小时,在我的所有搜索中找不到任何类似的东西,似乎无法通过实验取得任何进展。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

我在DataSnap服务器中创建了一个额外的方法,以便我可以通过调用第一个方法在数据库中创建一个记录,然后通过一次将其传递给第二个方法16k来逐步传输其他数据 - 在DataSnap服务器中缓冲它,直到收到所有部件。然后,我使用DataSnap服务器的完全缓冲值更新数据库中的记录。

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