Delphi SOAP 超时?

Posted

技术标签:

【中文标题】Delphi SOAP 超时?【英文标题】:Delphi SOAP timeout? 【发布时间】:2010-10-12 09:32:52 【问题描述】:

我偶尔会遇到 SOAP 超时,我确信是连接超时导致了问题。 30 秒后,我总是会暂停。通过谷歌搜索,我发现 InternetSetOption 的建议可用于设置超时,但是在我的机器上,我有 SOAPHttpTrans.pas (CodeGear Delphi 7),它具有以下代码:

Request := HttpOpenRequest(FInetConnect, 'POST', PChar(FURLSite), nil,
                           nil, nil, Flags, 0Integer(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)));

如何设置连接超时?

京东

【问题讨论】:

可能重复***.com/questions/2654122/… 在我的代码中我设置了 RIO.HTTPWebNode.ConnectTimeout := 300000; // 5 分钟; RIO.HTTPWebNode.SendTimeout := 300000; RIO.HTTPWebNode.ReceiveTimeout := 1200000; // 20 分钟。我确定是连接超时没有被应用。 您是否调试过这些行以查看 InternetSetOptions 是否实际上是使用正确的超时值调用的?您使用 InternetQueryOption 验证过实际超时值了吗? @SimaWB 它有相似之处,是的。不过,这不是一个完整的副本。在这种情况下,可能是服务器也有超时。如果服务器是带有 ASP.NET 代码的 IIS,那么您可能还想检查服务器代码,检查那里设置的可能的超时值。 (在配置文件中,检查 /configuration/system.web/httpRuntime/@executionTimeout) 感谢大家的帮助。 【参考方案1】:

我必须做的是使用 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 之前的吗? 我使用的是 Delphi 2007。在某些版本的 wininet 中存在一些已知的错误,它不支持超时——解决方法是使用 pass NIL 作为请求,使超时成为全局。 谢谢。我使用了上面的代码,但没有使用 NIL 并使用 InternetQueryOption() 进行检查,超时已经消失。现在一切似乎都在工作。我假设 Delphi 2007 中的代码没有错误,显然不是这样。 仅供参考:有关超时错误和解决方法的更多信息在这里:***.com/questions/2898261/…【参考方案2】:

IIRC,InternetSetOption 不适用于 IE6 wininet.dll。如果是您的情况,请尝试升级到 IE7 或更高版本。

【讨论】:

谢谢,我们使用的是 IE7 并且有“Codegear Delphi 2007”而不是 D7。我认为问题不是接收超时,因为我在被调用的应用程序上设置了一个断点,它根据接收超时值超时。

以上是关于Delphi SOAP 超时?的主要内容,如果未能解决你的问题,请参考以下文章

更改 Axis 1.4 生成的 SOAP Java 客户端的超时设置

使用 indy 10.5.8 在 Delphi 2010 中设置 KeepAlive 超时

Delphi WinAPI WaitForSingleObject-等待函数-等待指定对象处于有信号状态或超时间隔结束。

怎么在Delphi 的ClientSocket 中设置超时时间??急!

Web服务调用超时问题

Zapier频繁10.01秒超时