我使用实现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
设置为无效。
MaxLineLength
值。IdIOHandler.pas
文件编译到我的项目中。这些都可能吗?我一直在研究这个问题几个小时,在我的所有搜索中找不到任何类似的东西,似乎无法通过实验取得任何进展。
答案 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服务器的完全缓冲值更新数据库中的记录。
可能不是最有效的解决方案,但它可以工作,并且可以根据需要进行扩展。