Delphi SOAP超时?

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

+1

发现可以被复制的http://计算器.com/questions/2654122/soap-delphi-client-end-with-a-timeout-for-a-1mb-call – SimaWB 2010-10-12 09:48:34

+0

在我的代码中,我设置了RIO.HTTPWebNode.ConnectTimeout:= 300000; // 5分钟; RIO.HTTPWebNode.SendTimeout:= 300000; RIO.HTTPWebNode.ReceiveTimeout:= 1200000; // 20分钟我相信这是connecttimeout没有被应用。 – 2010-10-12 09:57:28

+1

您是否调试过这些行以查看InternetSetOptions是否实际使用正确的超时值调用?使用InternetQueryOption后,您是否验证了实际的超时值? – 2010-10-12 10:58:22

什么,我必须做的就是使用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

+0

嗨glob,d2007之前? – 2010-10-12 13:22:49

+0

我使用的是Delphi 2007.在某些版本的wininet中,有些bug并不尊重超时值,但是他们的解决方法是使用pass NIL作为请求,从而使超时变为全局。 – glob 2010-10-12 14:12:20

+0

谢谢。我使用了上面的代码,但不使用NIL并使用InternetQueryOption()进行检查,超时已经消失。现在似乎都在工作。我假设Delphi 2007中的代码是无缺陷的,显然不是这样。 – 2010-10-14 14:50:09

IIRC,InternetSetOption不与IE6的wininet.dll工作。如果是你的情况,请尝试升级到IE7或更高版本。

+0

谢谢,我们使用的是IE7并且拥有“Codegear Delphi 2007”NOT D7。我不认为这是问题的接收时间,因为我在被调用的应用程序上设置了一个中断点,并根据receivetimeout值超时。 – 2010-10-12 10:11:47