2010-05-24 13 views
5

Mam aplikację kliencką, która wysyła żądania SOAP. Ustawiłem limit czasu na 20 minut. Czasami jednak widzę błąd przekroczenia limitu czasu po 10 sekundach. Mam następujący w kodzie:Błędy limitu czasu usługi sieci Web w Delphi

RIO.HTTPWebNode.ReceiveTimeout := 1200000 

Czy muszę ustawić ConnectTimeout i SendTimeOut? Obecnie są ustawione na domyślne wartości 0. Jaką różnicę spowodowałoby to ustawienie?

używam Delphi 2007.

Patrząc dalej w komunikacie o błędzie widzę dostać „Operacja upłynął limit czasu ....”. Więc czy powinienem ustawić zero na zero, ponieważ naprawdę nie chcę w ogóle żadnego timeoutu?

+0

Obecnie wysyłamy duże ilości danych na serwer, czy powinienem ustawić ReceiveTimeOut na 0? Jednak to jeszcze nie wyjaśnia, że ​​dostaję "okazjonalnie" czas po 10 sekundach ... –

Odpowiedz

8

Implementacja CodeGear SOAPHTTPTrans ustala limity czasu na całym świecie, a nie na sesję. Oto odpowiedni kod z THTTPReqResp.Send:

{ Timeouts } 
if FConnectTimeout > 0 then 
    Check(not InternetSetOption({Request}nil, INTERNET_OPTION_CONNECT_TIMEOUT, Pointer(@FConnectTimeout), SizeOf(FConnectTimeout))); 
if FSendTimeout > 0 then 
    Check(not InternetSetOption({Request}nil, INTERNET_OPTION_SEND_TIMEOUT, Pointer(@FSendTimeout), SizeOf(FSendTimeout))); 
if FReceiveTimeout > 0 then 
    Check(not InternetSetOption({Request}nil, INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@FReceiveTimeout), SizeOf(FReceiveTimeout))); 

Co miałem zrobić, to skorzystać z obsługi OnBeforePost ustawić limity czasu:

transport.OnBeforePost := configureHttpRequest; 

procedure Tsomething.configureHttpRequest(const HTTPReqResp: THTTPReqResp; Data: Pointer); 
begin 
    InternetSetOption(Data, INTERNET_OPTION_CONNECT_TIMEOUT, Pointer(@FconnectTimeoutMS), SizeOf(FconnectTimeoutMS)); 
    InternetSetOption(Data, INTERNET_OPTION_SEND_TIMEOUT, Pointer(@FsendTimeoutMS), SizeOf(FsendTimeoutMS)); 
    InternetSetOption(Data, INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@FreceiveTimeoutMS), SizeOf(FreceiveTimeoutMS)); 
end; 

dokumentacji MSDN dla tych opcji znajduje się w http://msdn.microsoft.com/en-us/library/aa385328%28VS.85%29.aspx

+0

Dziękuję bardzo dużo. Jakieś pomysły, dlaczego miałbym czas na działanie nawet po kilku sekundach? –

+0

nie, nie 10 sekund. domyślny limit czasu zależy od zainstalowanej wersji IE - z IE7 to 30 sekund. a ponieważ domyślny kod określa czas oczekiwania na świecie, możesz napotkać problemy, jeśli inny kod zmieni limit czasu. zawsze jednoznacznie ustawiam limit czasu zgodnie z kodem w mojej odpowiedzi. – glob

Powiązane problemy