使用 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\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 进行流式传输时的奇怪行为