迄今为止有许多编程解决方案。然而,解决方案就是简单地在服务器上配置ClientBin目录(或者你存储XAP文件的任何文件夹)。
假设使用IIS,你需要明确指定ClientBin文件夹立即过期。这将导致正确的缓存配置头在检索XAP时发送。反过来,浏览器每次需要它时都会尝试检索XAP文件,但在绝大多数情况下,它只会得到304未修改响应并且可以继续使用其缓存副本。
我猜您正在看IE启发式问题的经典情况。在没有任何缓存配置头的情况下,IE根据自己的内部算法决定是否要重新请求资源。通过确保发送正确的到期标头,IE将遵守服务器的指示。
编辑
似乎需要更清楚地说明此方法的操作。此方法不会使XAP资源未缓存且每次需要获取。
通过在IIS中指定立即过期功能,我们获得以下响应头:
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 22359
Content-Type: application/octet-stream
Last-Modified: Tue, 21 Jul 2009 11:59:28 GMT
ETag: "fe734cb3fa9ca1:1352"
这并不会阻止 XAP 被缓存,它只是表示浏览器在未经服务器请求的情况下可能无法使用缓存的 XAP。请注意 Last-Modified 和 ETag 标头。
后续请求如下所示:
GET /clientBin/SomeApp.xap HTTP/1.1
If-Modified-Since: Tue, 21 Jul 2009 11:59:28 GMT
If-None-Match: "fe734cb3fa9ca1:135a"
Host: myhost.com
响应是:
HTTP/1.1 304 Not Modified
Cache-Control: no-cache
Last-Modified: Tue, 21 Jul 2009 11:59:28 GMT
Tag: "fe734cb3fa9ca1:135a"
这个响应没有实体主体,它允许浏览器使用缓存中现有的XAP。
如果XAP很大,则可能浏览器不会按照指定为no-cache的Cache-Control进行缓存。因此,更明确地设置可能更好。
不要使用“立即过期”框,而是使用自定义头列表配置Cache-Control标头。指定:
Cache-Control: max-age=0
这将导致浏览器缓存大型XAP文件,同时立即使它们过期。