C++ InternetOpenUrl间歇性超时

C++ InternetOpenUrl间歇性超时,c++,winapi,activex,fiddler,C++,Winapi,Activex,Fiddler,我有一些InternetOpenUrl请求奇怪地超时了。端点在那里,URL是正确的。这在activex控件内的同步循环中发生,大约在第6次执行时,它会在不影响服务器的情况下超时 HINTERNET hINet = InternetOpen(TEXT("InetURL/1.0"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 ); /*hangs*/ HINTERNET hFile = InternetOpenUrl( hINet, url.c_str(

我有一些InternetOpenUrl请求奇怪地超时了。端点在那里,URL是正确的。这在activex控件内的同步循环中发生,大约在第6次执行时,它会在不影响服务器的情况下超时

HINTERNET hINet = InternetOpen(TEXT("InetURL/1.0"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
/*hangs*/ HINTERNET hFile = InternetOpenUrl( hINet, url.c_str(), headers, headersLen, dwFlags, dwContext);
GetLastError仅返回12002操作超时。以下是完整的片段:

有趣的是,如果我将InternetOpen标志更改为INTERNET_OPEN_TYPE_DIRECT,并且fiddler没有运行,那么我就会失败(在几个成功的请求之后),如果我运行fiddler,请求都会成功


到目前为止,这已经在Win7/IE8和Vista64/IE8、XP/IE6上得到了复制。根据ivymike的评论,我查看了InternetOpenUrl标志,发现有一个我忽略了;互联网标志、布拉格语、NOCACHE

更新:此标志没有解决问题。我正在考虑从WinINet(InternetOpenUrl)移植到WinHTTP,以避免缓存行为


(将WinINet移植到WinHTTP)

您几乎肯定达到了WinINet中的“每台主机的连接数”限制

根据RFC2616中每个主机应具有的连接,您只能对并行运行的单个主机发出一定数量的请求。当达到上限时,WinINET将对挂起的请求排队,直到现有连接可用。如果在达到超时之前没有连接可用,则请求超时

WinINET在每个端点的基础上实现此限制,因此当您使用代理(如Fiddler、ISA、SQUID等)运行时,一次最多可以有“n”个连接处于活动状态,而如果不存在代理,则每个主机名最多可以有“n”个连接


如果ActiveX控件在响应完成时未正确释放连接,则可能会遇到此问题。通常,运行Fiddler不应该为您“修复”,但您可以使用NetMon检查发生了什么。

好的,所以我最初认为EricLaw是正确的,并评论道:“我特别的问题是,在每次控件ajax调用之后都会发生javascript ajax调用。这创建了一个竞争条件,当我在控件内进行ajax调用时,最终有4个javascript ajax调用没有返回。(是的,我在原始问题中错列了我的环境)

这一评论是不正确的

这个问题实际上就是讨论的问题:

“ActiveX控件有一个常见缺陷,即单线程单元 (STA)ActiveX和COM对象必须避免:STA COM对象无法执行 阻塞STA线程上的操作,除非COM对象也 Windows消息。因此,如果控件需要执行同步 阻塞操作时,需要实现Windows消息泵 正在等待阻止操作完成。“


这解决了这个问题(并打开了一个全新的蠕虫罐)。如果你遇到这种情况,欢迎在这里发表评论,我会更好地解释。

可能你不应该将fiddler与这种情况混合使用。缓存请求是众所周知的。此外,可能你应该在url中附加一个随机参数,以检查请求是否真的成功或只是从缓存返回。我经历过InternetOp尽管设置了所有的无缓存标志,但仍然可以缓存请求。不,Fiddler“不知道缓存请求”搜索者:我的特别问题是每次控件ajax调用之后都会出现javascript ajax调用。这创建了一个竞争条件,当我在控件内进行ajax调用时,最终有4个javascript ajax调用没有返回。(是的,我在最初的问题中错误地陈述了我的环境)我想我可能遇到了类似的问题。如果你有机会,你能看看我看到的行为是否与你的问题有着相同的根源: