我有一个发出SOAP请求的客户端应用程序。我已将超时设置为20分钟。但是,有时我会看到10秒后发生超时错误。 我在代码中有以下内容:
RIO.HTTPWebNode.ReceiveTimeout := 1200000
我是否需要设置ConnectTimeout
和SendTimeOut
?目前它们被设置为默认值0.这些设置有什么区别?
我正在使用Delphi 2007。
进一步查看错误消息,我看到“操作超时......”。那么我应该将ReceiveTimeOut
设置为零,因为我真的不想要任何超时吗?
答案 0 :(得分: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)));
我必须做的是使用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;
这些选项的MSDN文档位于http://msdn.microsoft.com/en-us/library/aa385328%28VS.85%29.aspx