Delphi - 如何设置SoapClient的超时时间?

3

I'm doing this before post:

FTimeout := 30000;

InternetSetOption(Pointer(@Data), INTERNET_OPTION_CONNECT_TIMEOUT, Pointer(@FTimeOut), SizeOf(FTimeOut));
InternetSetOption(Pointer(@Data), INTERNET_OPTION_SEND_TIMEOUT, Pointer(@FTimeOut), SizeOf(FTimeOut));
InternetSetOption(Pointer(@Data), INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@FTimeOut), SizeOf(FTimeOut));

但是它不起作用。有人可以帮忙吗?
1个回答

4

应该可以的。您没有说您从哪里调用它,但我在OnBeforePost处理程序中调用我的函数。

我的函数看起来像这样:

function SetTimeout(const HTTPReqResp: THTTPReqResp; Data: Pointer; NumSecs : integer) : boolean;
var
  TimeOut: Integer;
begin
  // Sets the receive timeout. i.e. how long to wait to 'receive' the response
  TimeOut := (NumSecs * 1000);
  try
    InternetSetOption(Data, INTERNET_OPTION_RECEIVE_TIMEOUT,  Pointer(@TimeOut),  SizeOf(TimeOut));
    InternetSetOption(Data, INTERNET_OPTION_SEND_TIMEOUT,  Pointer(@TimeOut),  SizeOf(TimeOut));
  except on E:Exception do
    raise Exception.Create(Format('Unhandled Exception:[%s] while setting timeout to [%d] - ',[E.ClassName, TimeOut, e.Message]));
  end;
end;

也许你的程序是可行的,只是你没有足够长的时间去观察? 一个常见的错误是假设单位为秒,而实际上应该是毫秒。我使用带有响应延迟的SoapUI,这样我就可以“确定”它是有效的。 - Chris Thornton
1
还可以检查InternetSetOption的返回值。 - Andreas Rejbrand
调用GetLastError函数以查看internetSetOption可能设置的错误代码。 - Chris Thornton
ERROR_INVALID_HANDLE 6 (0x6) 句柄无效。 - Chris Thornton
所以我认为你的代码放错了位置。你从哪里调用它?它应该在RIO的OnBeforePost方法中。此外,尝试将Pointer(@Data)替换为我的示例中的Data。 - Chris Thornton
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接