delphi调用webservice的超时处理(HTTPWebNode timeout)
在用delphi7实现远程调用webservice时,碰到超时处理的问题,我的设置如下:
Delphi/Pascal code
?12345 var RIO: THTTPRIO; rio.HTTPWebNode.SendTimeout :=3000; rio.HTTPWebNode.ConnectTimeout := 3000; rio.HTTPWebNode.ReceiveTimeout := 6000;
可是以上设置并没有起到作用,在第一次远程连接时,还是会出现失败(3秒,测试的webservice构建在我本地,webservice方法中使用thread.sleep(XX)模拟返回延迟);当我把timeout都设置的很小时,竟然也会有成功调用的情况.
希望大家给些想法或建议.
还发现个问题,设置超时时间后,会报错"ESOAPHTTPException with message '试图引用不存在的令牌' URL:.......... SOAPAction:.......",由于添加了try .. except,之前并未留意.这外异常总是在第一次调用webservice时出现,之后就不再报错.
这应该是delphi调用webservice设置超时时间的BUG,google到的'http://shenoyatwork.blogspot.com/2006/11/setting-timeouts-in-delphi-soap.html'(翻墙),里面主要内容如下:
Delphi/Pascal code
?1234567891011121314151617 {The way for you to do this is: 1) Do not set the ReceiveTimeout or the ConnectTimeout or other timeout properties of HTTPRio.HTTPWebNode. 2) Handle HTTPRio.HttpWebNode.BeforePost event and do this: } procedure TForm2.HTTPRIO1HTTPWebNode1BeforePost( const HTTPReqResp: THTTPReqResp; Data: Pointer); var TimeOut : integer; begin TimeOut := 2000; // in milleseconds. InternetSetOption(Data, INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@TimeOut), SizeOf(TimeOut)); end;
我比较迷茫的是"Handle HTTPRio.HttpWebNode.BeforePost event"的code,如何添加,"HTTPRIO1HTTPWebNode1BeforePost"这个函数名应该不是随便写的吧,不然delphi如何自动用此函数处理"HTTPRio.HttpWebNode.BeforePost event"呢?