Indy IdHTTP.Post在Delphi应用程序中间歇性地没有返回应答

时间:2016-01-21 11:51:30

标签: delphi http delphi-2010 indy

我在我的应用程序中使用IdHTTP.Post将数据上传到云中的服务器。云中的DLL将数据保存到SQL Server数据库,并将简单消息返回给应用程序。

上传的数据只是在循环中上传的一串长字符串(这里不会说明原因)。循环中的每个字符串几乎总是相同的长度。

例如:

For I:=1 to 10 do
begin
  ...
  Reply:=IdHTTP.Post(URL,String);
  ...
end;

这种方法在98%的时间内完美运行。有时,当循环超过100时,“回复”将为空白。如果我再试一次,那就行了。

我尝试了各种各样的东西,其中之一是添加

Sleep(2000);

在循环的每次迭代之后,这似乎也成功了!

因此,简而言之,我的上传似乎偶尔会把自己捆绑成一个结,当上传是大尺寸的时候。任何关于如何比'睡眠'更好地处理这个问题的建议将不胜感激。

我没有对默认设置中的IdHTTP组件进行任何更改,除了:

IdHTTP.ConnectTimeout:=5000;
IdHTTP.ReadTimeout   :=5000;

我正在使用Delphi 2010。

请注意,每次迭代的字符串长度都相同,无论是循环10次还是100次。所以字符串长度本身似乎不是问题。

更新

所以忽略了我认为上面发生的大部分内容。 @Remy Lebeau正确地确定问题是答复没有被正确解码,这是因为IdHTTPOptions。[hoForceEncodeParams]设置为false。

之前的问题概述了原因:

Delphi TIdHTTP POST does not encode plus sign

@Remy,我在Indy的版本,正如你在旧问题中指出的那样,并且在回答这个问题时,肯定已经过时了。我对安装更高版本有点犹豫,因为安装说明看起来有点吓人,所以我选择手动编码而不是在此期间。这看起来已经适得其反,所以现在肯定会看一下。

至少现在我知道是什么导致了我的问题。

我有一些跟进的问题,您可以帮助我:

  1. 我想我可能做错了,但即使我在组件上设置hoForceEncodeParams为True或False,在查看Fiddler时,在编码进入服务器方面似乎并不总是一致的。我现在只选了这个,因为我正在仔细研究它。无论如何,编码的唯一方法是在发布之前将其设置在代码中,换句话说,忽略组件上的设置。这可能是正确的,还是我错过了什么?这就是为什么我首先理解错误的原因,因为在循环的第一次迭代中编码是正确的,但随后在后续迭代中莫名其妙地改变了。
  2. 使用IdHTTP.Get,即使hoForceEncodeParams设置为false,我也会收到回复。这有意义吗?

0 个答案:

没有答案