代码之家  ›  专栏  ›  技术社区  ›  Dustin Getz sunsations

InternetOpenUrl间歇性超时

  •  0
  • Dustin Getz sunsations  · 技术社区  · 14 年前

    我有一些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操作超时。以下是完整片段: http://gist.github.com/559317

    有趣的是,如果我将InternetOpen标志更改为InternetOpen类型\u DIRECT,并且fiddler没有运行,我会得到失败(在几个成功的请求之后),如果我运行fiddler,请求都会成功。

    到目前为止,这已经在Win7/IE8和Vista64/IE8、XP/IE6上得到了复制

    3 回复  |  直到 14 年前
        1
  •  1
  •   EricLaw    14 年前

    在WinINET中,您几乎肯定达到了“每个主机的连接数”限制。

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

        2
  •  1
  •   Dustin Getz sunsations    14 年前

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

    此评论不正确。

    问题其实就是讨论的问题 here :

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

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

        3
  •  0
  •   Dustin Getz sunsations    14 年前

    根据ivymike的评论,我查看了InternetOpenUrl标志,看到了一个我忽略的标志:INTERNET\u FLAG\u PRAGMA\u NOCACHE

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

    (将WinINet移植到WinHTTP) http://msdn.microsoft.com/en-us/library/aa384068(VS.85).aspx