gpt4 book ai didi

delphi - HttpSendRequest 阻止 SOAP 调用

转载 作者:行者123 更新时间:2023-12-03 15:36:22 27 4
gpt4 key购买 nike

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

在工作期间,应用程序会对网络服务进行大量调用(~1000-2000)。在某个时刻(上次是 782 请求项,第一次是接近尾声)应用程序卡住。经过一番挖掘和记录后,我发现应用程序阻塞了

WinInetResult := HttpSendRequest(Request, nil, 0, DatStr.Bytes, DatStr.Size);

在 Soap.SOAPHTTPTrans 单元中

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

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

我的下一次尝试是使用 Indy 代替 WinInet 进行 HTTP 通信。对于 Indy,应用程序可以正常工作,没有锁定。但缺点是性能下降 - Indy 中应用程序的工作时间要长两倍。

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

附注

奇怪的是,Indy 的性能却如此下降。也许有一些属性、参数可以提高性能?

最佳答案

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

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

关于delphi - HttpSendRequest 阻止 SOAP 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23480635/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com