Delphi DataSnap将入站请求限制为16k

Delphi DataSnap将入站请求限制为16k,delphi,delphi-xe2,indy,datasnap,indy10,Delphi,Delphi Xe2,Indy,Datasnap,Indy10,我用Delphi XE2构建了一个DataSnap服务器,它实现了TDSHTTPService。当入站请求传入时,线程中会调用TIdIOHandler.InitComponent,然后将执行交给TServerMethods中调用的方法。我在服务器中没有任何Indy组件,因此DataSnap在后台使用Indy 10 .InitComponent()将IO处理程序的最大行长度设置为硬编码值(FMaxLineLength:=IdMaxLineLengthDefault;),即16384。我找不到增加价

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

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

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

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

除了删除Indy 10的Delphi XE2安装并下载源代码、调整常量值和编译/维护我自己的构建之外,我解决了这个问题

我在DataSnap服务器中创建了一个额外的方法,这样我就可以通过调用第一个方法在数据库中创建一个记录,然后通过一次将剩余数据传递给第二个方法16k来递增地流式传输数据——在DataSnap服务器中对其进行缓冲,直到接收到所有部分。然后,我使用来自DataSnap服务器的完全缓冲值更新数据库中的记录


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

在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;

非常奇怪,HTTP实体是一个任意的八位字节序列——也许印地的开发者只考虑HTML数据?HTML实体中没有“行”。您可以尝试完全从Delphi卸载Indy,并从可用的源代码中安装一个修改过的构建。无论如何,整个Datasnap堆栈都是一堆设计不当的库,我会寻找更好的远程处理解决方案。有两种设置,一行的最大长度,以及在超过最大长度时是拆分请求还是引发异常。默认值为16384,并引发异常。对于来自客户端的出站请求,很容易设置这两个参数。我看不到在服务器端为向DataSnap服务器的入站请求设置它们的方法。