Delphi SOAP调用上的HttpSendRequest块

Delphi SOAP调用上的HttpSendRequest块,delphi,soap,wininet,Delphi,Soap,Wininet,我对Delphi XE2应用程序有问题。有时WinInet对ASMX服务的调用会阻塞,并且永远不会返回-用户必须终止从任务管理器到关闭应用程序的进程。 要连接到ASMX服务,应用程序将使用WSDLImp工具生成的服务 在工作过程中,应用程序对web服务进行了大量调用(~1000-2000)。在某个时刻(上次是782请求项,第一次接近尾声),应用程序冻结。经过一番挖掘、记录,我发现应用程序无法正常运行 WinInetResult := HttpSendRequest(Request, nil, 0

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

在工作过程中,应用程序对web服务进行了大量调用(~1000-2000)。在某个时刻(上次是782请求项,第一次接近尾声),应用程序冻结。经过一番挖掘、记录,我发现应用程序无法正常运行

WinInetResult := HttpSendRequest(Request, nil, 0, DatStr.Bytes, DatStr.Size);
在Soap.SOAPHTTPTrans单元中

第一个猜测是这是服务器端的问题——服务器在处理请求时挂起。但在试用中,服务器正在处理来自其他客户端的请求,而目标客户端被阻止。而且,当您使用Fiddler调试来自应用程序的http流量时,一切都按预期工作,没有锁。此外,WinInet的SendTimeout、ReceiveTimeout、ConnectTimeout没有任何效果–没有超时错误。还有一点,应用程序块不是在特定的方法调用上,而是在不同的方法调用上

在谷歌搜索之后,我发现HttpSendRequest可以阻止超过最大并行连接数。但在应用程序中并没有并行执行——每个操作都在主GUI线程中执行

我的下一次尝试是使用Indy进行HTTP通信,而不是WinInet。在Indy上,应用程序可以正常工作,没有锁。但缺点是性能下降——应用程序的工作时间比Indy长两倍

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

附言


奇怪的是,印地的表现如此糟糕。也许有一些属性和参数可以提高性能?

因此,我终于解决了这个问题

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

其他信息。我使用Wireshark记录http通信。这是对服务器的最后一个请求:正如你们所看到的,应用初始化和服务器的连接,服务器等待来自应用的数据,应用不发送任何东西(因为挂起),服务器重置连接