Delphi中的Web服务超时错误

时间:2010-05-24 15:52:54

标签: web-services delphi soap network-programming

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

RIO.HTTPWebNode.ReceiveTimeout := 1200000

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

我正在使用Delphi 2007。

进一步查看错误消息,我看到“操作超时......”。那么我应该将ReceiveTimeOut设置为零,因为我真的不想要任何超时吗?

1 个答案:

答案 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