Delphi TIdHTTP POST与GET相比非常慢

Dan*_*iel 1 delphi http indy

德尔福2009

我最近从多个GET请求切换到单个POST,我认为它会更有效但事实证明它要慢得多.它从1-2秒变为8-10秒,我无法弄清楚原因.

unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP;

type
  TForm4 = class(TForm)
    d: TIdHTTP;
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.Button1Click(Sender: TObject);
var m: tmemorystream;
    data: tstringlist;
    i: integer;
begin
  memo1.Clear;

  m:=tmemorystream.Create;
  data:=tstringlist.Create;
  data.Add(format('test1');
  data.Add(format('test2');

  d.Post('http://www.someurl.com/test.php', data, m);
  m.Position:=0;
  data.LoadFromStream(m);
  memo1.Lines.Add('Received:');

  for i := 0 to data.count - 1 do
    memo1.Lines.Add(data[i]);

  m.Free;
  data.Free;
end;

end.
Run Code Online (Sandbox Code Playgroud)

并在服务器上

<?php
echo "1\n";
?>
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 6

确保hoKeepOriginalProtocolTIdHTTP.HTTPOptions属性中启用了标志.默认情况下,TIdHTTP.Post()除非启用该标志,否则每次调用连接时都会强制关闭连接,无论使用HTTP保持活动.断开连接和重新连接的额外开销可能会占用额外的时间.


iPa*_*h ツ 5

我使用不同的网址做了一个简单的测试:

d.Post('http://whatismyip.org', data, m); // Using DNS name
Run Code Online (Sandbox Code Playgroud)

要么

d.Post('http://54.242.203.46', data, m); // Using IP
Run Code Online (Sandbox Code Playgroud)

邮政需要大约1秒,所以我认为你的问题可能与Indy无关.我的建议:

  • 检查PC的DNS解析.尝试使用IP地址查看是否存在差异;
  • 尝试使用外部工具(curl,vbscript等)向同一站点发出POST请求并测量时间;
  • 使用网络监视工具(Wireshark,MS网络监视器等)查看服务器响应POST请求所需的时间或客户端在解析地址和实际Post请求之间花费的时间.

这些步骤可以缩小问题的范围.

如果这些都没有帮助 - 尝试将Indy升级到最新版本.