5

我正在使用PassthruAPP方法连接到 IE 发出的 HTTP/HTTPS 请求。

它在大多数情况下运行良好,但是我注意到了一个问题。一次只有一个下载线程处于活动状态,通常 IE 使用两个下载线程。我可以看到创建了两个 IInternetProtocol 对象,但 IE 一次只使用一个。

这发生在 IE7 上,我还没有尝试过其他版本。

问题似乎是 IE 在IInternetSession::RegisterNameSpace调用其任何默认处理程序时会退回到一次下载一个项目。即使我正在注册HTTPS处理程序,下面的代码也会导致HTTP下载是连续的。注册 'file://' 会导致同样的问题。

CComPtr<IInternetSession> spSession;
CoInternetGetSession(0, &spSession, 0);

MetaFactory::CreateInstance(CLSID_HttpSProtocol, &m_spCFHTTPS);
spSession->RegisterNameSpace(m_spCFHTTPS, CLSID_NULL, L"https", 0, 0, 0)

页面上的前几项总是会发生这种情况,但似乎在发布文档完成后,可能会再次发生并发下载。例如,在页面完成加载后执行的 Javascript 代码可以同时加载图像。

4

2 回答 2

3

InternetProtocolRootEx::StartEx()可以通过在已注册的 HTTP/HTTPS 协议上修补 COM VTable 来解决此问题。由于这不会直接替换协议处理程序,因此 IE 不会回退到单线程模型。

此处描述了该技术:

http://web.archive.org/web/20130313164317/http://www.blackfishsoftware.com/blog/don/passthroughapp_bho_toolbar_intercepting_requests_responses

于 2010-04-05T05:02:35.227 回答
2

是的,这在设计上是已知的,并且在各个地方都有记录。(这样做是因为我们无法对协议处理程序的线程安全性做出假设)

这是建议您不要尝试包装 HTTP/HTTPS 协议的众多原因之一。

于 2010-04-08T02:23:16.797 回答