Delphi中的Web服务超时错误

JD.*_*JD. 6 delphi soap web-services network-programming

我有一个发出SOAP请求的客户端应用程序.我已将超时设置为20分钟.但是,有时我会看到10秒后发生超时错误.我在代码中有以下内容:

RIO.HTTPWebNode.ReceiveTimeout := 1200000
Run Code Online (Sandbox Code Playgroud)

我需要设置ConnectTimeoutSendTimeOut吗?目前它们被设置为默认值0.这些设置有什么区别?

我正在使用Delphi 2007.

进一步查看错误消息,我看到我得到"操作超时......".所以我应该将我设置ReceiveTimeOut为零,因为我真的不想要任何超时?

glo*_*lob 8

CodeGear的SOAPHTTPTrans实现设置全局超时,而不是每个会话.以下是相关代码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)));
Run Code Online (Sandbox Code Playgroud)

我必须做的是使用OnBeforePost处理程序来设置超时:

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;
Run Code Online (Sandbox Code Playgroud)

有关这些选项的MSDN文档,请访问http://msdn.microsoft.com/en-us/library/aa385328%28VS.85%29.aspx