Delphi SOAP超时?
我偶尔会遇到SOAP超时问题,我相信这是造成问题的连接超时。 30秒后,我总是得到一个时间。谷歌搜索,我发现建议InternetSetOption可以用来设置超时,但是我的机器上,我有SOAPHttpTrans.pas(CodeGear的Delphi 7中),其中有下面的代码:Delphi SOAP超时?
Request := HttpOpenRequest(FInetConnect, 'POST', PChar(FURLSite), nil,
nil, nil, Flags, 0{Integer(Self)});
Check(not Assigned(Request));
{ Timeouts }
if FConnectTimeout > 0 then
Check(not InternetSetOption(Request, INTERNET_OPTION_CONNECT_TIMEOUT, Pointer(@FConnectTimeout), SizeOf(FConnectTimeout)));
if FSendTimeout > 0 then
Check(not InternetSetOption(Request, INTERNET_OPTION_SEND_TIMEOUT, Pointer(@FSendTimeout), SizeOf(FSendTimeout)));
if FReceiveTimeout > 0 then
Check(not InternetSetOption(Request, INTERNET_OPTION_RECEIVE_TIMEOUT, Pointer(@FReceiveTimeout), SizeOf(FReceiveTimeout)));
如何设置连接超时?
JD
什么,我必须做的就是使用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
嗨glob,d2007之前? – 2010-10-12 13:22:49
我使用的是Delphi 2007.在某些版本的wininet中,有些bug并不尊重超时值,但是他们的解决方法是使用pass NIL作为请求,从而使超时变为全局。 – glob 2010-10-12 14:12:20
谢谢。我使用了上面的代码,但不使用NIL并使用InternetQueryOption()进行检查,超时已经消失。现在似乎都在工作。我假设Delphi 2007中的代码是无缺陷的,显然不是这样。 – 2010-10-14 14:50:09
IIRC,InternetSetOption不与IE6的wininet.dll工作。如果是你的情况,请尝试升级到IE7或更高版本。
谢谢,我们使用的是IE7并且拥有“Codegear Delphi 2007”NOT D7。我不认为这是问题的接收时间,因为我在被调用的应用程序上设置了一个中断点,并根据receivetimeout值超时。 – 2010-10-12 10:11:47
发现可以被复制的http://计算器.com/questions/2654122/soap-delphi-client-end-with-a-timeout-for-a-1mb-call – SimaWB 2010-10-12 09:48:34
在我的代码中,我设置了RIO.HTTPWebNode.ConnectTimeout:= 300000; // 5分钟; RIO.HTTPWebNode.SendTimeout:= 300000; RIO.HTTPWebNode.ReceiveTimeout:= 1200000; // 20分钟我相信这是connecttimeout没有被应用。 – 2010-10-12 09:57:28
您是否调试过这些行以查看InternetSetOptions是否实际使用正确的超时值调用?使用InternetQueryOption后,您是否验证了实际的超时值? – 2010-10-12 10:58:22