使用 IXMLHTTPRequest 2 进行流式传输时如何在 Windows 8 上禁用缓存?

Posted

技术标签:

【中文标题】使用 IXMLHTTPRequest 2 进行流式传输时如何在 Windows 8 上禁用缓存?【英文标题】:How to disable caching on Windows 8 when streaming with IXMLHTTPRequest2? 【发布时间】:2012-12-12 21:23:48 【问题描述】:

在我们的 Windows 8 应用程序中,我们使用 IXMLHTTPRequest2 方法通过 HTTP 传输文件,文件的大小可以达到千兆字节。这一切都很完美,除了 WinRT 在内部有一个缓存系统,它将通过对 IXMLHTTPRequest2 的调用流式传输的所有内容存储在临时 Internet 缓存中。随着我们流式传输越来越多的文件,缓存永远不会被清空,它只是开始占用越来越多的磁盘空间,直到磁盘满为止。

理想情况下,我们希望完全禁用此缓存功能。我们可以接受的另一个选择是缓存文件将在片刻后被删除(尽管我们希望避免浏览临时 Internet 缓存并手动删除文件)。

我们尝试在服务器响应中添加“Expires: 0”标头,以及直接在 IE 中禁用缓存(我们认为这可能会影响对 IXMLHTTPRequest2 的调用),但无济于事。

有人对此有什么想法吗?

我意识到这个问题与here 发布的另一个问题相似,但是,我们的问题更多地与缓存占用的空间有关,而不是文件的“新鲜度”。

编辑: 我们还在 MSDN 论坛上找到了这个post,据一位 MSFT 版主说,“系统还会定期清理缓存,因此您不必担心磁盘空间不足",但在我们的场景中并非如此。

【问题讨论】:

【参考方案1】:

根据 MSDN 论坛上的 this post,这是不可能的,并且是 WinRT 的一个已知限制。

有时唯一的答案是坏消息。 :-[

【讨论】:

在每个请求的 IRI 末尾添加一个随机查询字符串怎么样?例如:yourdomain.com/yourfile?random=201212121646 @Kiewic :这会增加缓存中的数据量,使 OP 的问题变得更糟。即,问题在于缓存变得太大,而不是 OP 得到过时的响应。 MSDN 帖子提到了“AC\INetCache”位置,但在我们的例子中,缓存文件存储在“C:\Users\\AppData\Local\Microsoft\Windows\Temporary互联网文件\内容.IE5";你认为那里也一样吗? @Fueled :对不起,我真的不确定。您在 MSDN 论坛上针对 Prashant 发表的帖子可能是获得正确答案的最佳途径。您是否考虑过使用Casablanca 而不是IXMLHTTPRequest2?这样可以完全避免这个问题。【参考方案2】:

正如 ildjarn 所指出的,这在 Windows 8 上似乎是不可避免的。但似乎有办法为运行 Windows 8.1 的客户端解决此问题。

我自己没有尝试过,但我只是注意到现在有“IXMLHTTPRequest3”,它用一些新功能扩展了“IXMLHTTPRequest2”: http://msdn.microsoft.com/en-us/library/windows/desktop/dn376398%28v=vs.85%29.aspx

相关功能是: XHR_PROP_NO_CACHE – 抑制 HTTP 请求的缓存读取和写入。

这听起来很有希望。

【讨论】:

以上是关于使用 IXMLHTTPRequest 2 进行流式传输时如何在 Windows 8 上禁用缓存?的主要内容,如果未能解决你的问题,请参考以下文章

当 responseText 包含有效 Xml 时,IXMLHttpRequest.responseXml 为空,没有解析错误

在使用 Android 2.2 的 HTC Desire 上使用 Android MediaPlayer 进行流式传输时的奇怪行为

试图通过 TCP 流式传输 2 路音频?

使用 AVAudioplayer 进行流式传输

如何使用 ASP.NET Core 进行流式传输

如何使用 CODING 进行瀑布流式研发