HttpSendRequest在SOAP调用上阻塞

时间:2014-05-05 19:52:36

标签: delphi soap wininet

我在使用Delphi XE2应用程序时遇到问题。有时WinInet调用ASMX服务块并且永远不会返回 - 用户必须从任务管理器终止进程以关闭应用程序。 要连接到ASMX服务应用程序,请使用由WSDLImp工具生成的服务。

在工作期间,app会对Web服务进行大量调用(~1000-2000)。并且在某个时刻(上次它是782请求项目,第一次它接近结束)应用程序冻结。经过一些挖掘,记录后我发现了

上的应用程序块
WinInetResult := HttpSendRequest(Request, nil, 0, DatStr.Bytes, DatStr.Size);

在Soap.SOAPHTTPTrans单位

首先猜测是服务器端问题 - 服务器挂起请求处理。但是在试验服务器上处理来自其他客户端的请求,而目标一被阻止。并且,当您使用Fiddler从应用程序调试http流量时,一切都按预期工作,没有锁定。此外,WinInet的SendTimeout,ReceiveTimeout,ConnectTimeout无效 - 没有超时错误。还有一点,app不会阻止特定的方法调用,而是针对不同的方法调用。

谷歌搜索后,我发现HttpSendRequest可以阻止超出最大并行连接。但是app中没有并行执行 - 每个动作都在主GUI线程中执行。

我的下一次尝试是使用Indy进行HTTP通信而不是WinInet。使用Indy,应用程序可以正常工作,无需锁定。但缺点是性能下降 - 应用程序的工作需要两倍于Indy。

这不是很好。所以,我想回到WinInet。但为此我需要找到阻塞的原因。有人知道为什么HttpSendRequest可以阻止吗?

P.S。

奇怪的是,Indy我们有这样的性能下降。也许有一些属性,参数来提高性能?

1 个答案:

答案 0 :(得分:0)

所以,我终于解决了这个问题。

在所有试验都没有成功之后,我使用WinHTTP而不是WinInet重新实现了SOAP调用。 使用WinHTTP,一切正常。