Пользовательский тайм-аут TNetHttpClient

Во-первых, я очень рад, что Embarcadero/Idera наконец решили включить встроенный компонент для связи HTTP/S!

И я знаю, что это звучит как глупый вопрос (и, возможно, это так) ... но у меня проблемы с поиском свойства (или чего-то еще) для установки пользовательского TimeOut (ответ, получение, ...).

Может ли кто-нибудь указать мне правильное направление?


person LukaL    schedule 22.12.2015    source источник
comment
Я не думаю, что у TNetHttpClient есть свойство или метод тайм-аута (посмотрев на docwiki.embarcadero.com/Libraries/XE8/en/)   -  person Ryno Coetzee    schedule 22.12.2015
comment
Но почему? :) Я даже пробовал это с классическим InternetSetOption, но безуспешно. InternetSetOption(nil, INTERNET_OPTION_CONNECT_TIMEOUT, @LConnectTimeoutMS, Sizeof(LConnectTimeoutMS));   -  person LukaL    schedule 22.12.2015
comment
Я понятия не имею, брат. Кстати: я комментировал с точки зрения Firemonkey, и похоже, что вы делаете вещи для Windows, так что, может быть, просто используйте indy? stackoverflow.com/questions/12858551/   -  person Ryno Coetzee    schedule 22.12.2015
comment
Это так - мы использовали Indy, но мне не нравятся внешние библиотеки DLL для HTTPS. Итак, когда я узнал, что теперь это решается с помощью собственного компонента Delphi, я был взволнован ... Но моя удача отвернулась от меня очень быстро.   -  person LukaL    schedule 22.12.2015


Ответы (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. Надеюсь это поможет!

person unixguru65    schedule 22.12.2015
comment
Работает как шарм. Я добавил еще две строки (WINHTTP_OPTION_SEND_TIMEOUT и WINHTTP_OPTION_RECEIVE_TIMEOUT). Спасибо @unixguru65! - person LukaL; 23.12.2015
comment
Обратите внимание, что это изменение сделает класс зависимым от платформы, поскольку WINHTTP_OPTION_CONNECT_TIMEOUT и т. д. недоступны на Android/iOS/OSX. - person mjn; 24.12.2015