【问题标题】:TNetHttpClient Custom TimeOutTNetHttpClient 自定义超时
【发布时间】:2015-12-22 08:08:51
【问题描述】:

首先我很高兴 Embarcadero/Idera 最终决定包含一个用于 HTTP/S 通信的内置组件!

而且我知道这听起来像是一个愚蠢的问题(也许确实如此)......但我在寻找属性(或其他东西)来设置自定义 TimeOut(响应、接收......)时遇到问题。

有人能指出正确的方向吗?

【问题讨论】:

  • 我不认为TNetHttpClient有超时属性或方法(看docwiki.embarcadero.com/Libraries/XE8/en/…
  • 但是……为什么? :) 我什至用经典的 InternetSetOption 尝试过,但没有成功。 InternetSetOption(nil, INTERNET_OPTION_CONNECT_TIMEOUT, @LConnectTimeoutMS, Sizeof(LConnectTimeoutMS));
  • 我不知道兄弟。顺便说一句:我从 Firemonkey 的角度发表评论,看起来你在做 Windows 的东西,所以也许只使用 indy? stackoverflow.com/questions/12858551/…
  • 就是这样 - 我们一直在使用 Indy,但我不喜欢 HTTPS 的外部 DLL。所以,当我发现现在可以用原生 Delphi 组件“解决”这个问题时,我很兴奋……但我的运气很快就用完了。

标签: delphi delphi-10-seattle


【解决方案1】:

我也有类似的问题,但我只需要能够为连接超时设置自定义值。我必须复制和修改两个 RTL 文件才能完成此操作。首先我对 System.Net.Http.Client.pas 文件的修改:

THTTPClient = class(TURLClient)
...
private
  FConnectTimeout: Integer; // <---- add this line
...
public
  property ConnectTimeout: Integer read FConnectTimeout write FConnectTimeout; // <---- add this line

这是我对 System.Net.HttpClient.Win.pas 文件的修改:

procedure TWinHTTPRequest.DoPrepare;
var // <---- add this line
  LConnectTimeout: integer; // <---- add this line
begin
  inherited;
  SetWinProxySettings;

  LConnectTimeout := THTTPClient(FClient).ConnectTimeout; // <---- add this line
  WinHttpSetOption(FWRequest, WINHTTP_OPTION_CONNECT_TIMEOUT, @LConnectTimeout, sizeof(LConnectTimeout)); // <---- add this line
end;

这些修改适用于 Delphi 10 Seattle RTL 文件。希望这会有所帮助!

【讨论】:

  • 像魅力一样工作。我又添加了两行(WINHTTP_OPTION_SEND_TIMEOUT 和 WINHTTP_OPTION_RECEIVE_TIMEOUT)。谢谢@unixguru65!
  • 请注意,此更改将使类依赖于平台,因为 WINHTTP_OPTION_CONNECT_TIMEOUT 等在 Android / iOS / OSX 上不可用
猜你喜欢
  • 2019-10-18
  • 2020-09-15
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多