有没有办法强制WebClient,而不是返回缓存数据?

时间:2010-03-11 13:28:39

标签: silverlight caching webclient

我正在从这样的网络服务器目录中检索图像:

        WebClient webClientImgDownloader = new WebClient();
        webClientImgDownloader.OpenReadCompleted += new OpenReadCompletedEventHandler(webClientImgDownloader_OpenReadCompleted);
        if(uriIndex < uris.Count())
            webClientImgDownloader.OpenReadAsync(new Uri(uris[uriIndex], UriKind.Absolute));

但我注意到如果删除图像,silverlight会继续检索图像,就像它在那里一样。

当我将图像URL输入到FireFox中时,我也看到了图像,但是我点击了Reload,它给出了图像不存在的相应错误。然后,当我再次运行我的silverlight应用程序时,它也恰当地给我一个错误,即图像不存在,好像浏览器已经在某处清除了缓存标记。

如何在代码中通过WebClient进行“刷新”,这样如果服务器上突然出现图像,Silverlight不会继续给我一个缓存副本?

3 个答案:

答案 0 :(得分:7)

这是一个棘手的问题,因为缓存通常是由网站标题未指定无缓存引起的。我发现在过去处理这些缓存问题的最简单方法就是提供随机查询字符串参数,以便Web服务器将每个请求解释为新请求。

如果您目前正在申请www.domain.com/image.jpg,请尝试www.domain.com/image.jpg?rand=XXXX,其中XXXX是服务器端代码中生成的随机值。

答案 1 :(得分:4)

您需要确定您的网站上的各种内容的缓存策略。

如果必须确保在发出请求时显示最新状态,请确保服务器适当地配置响应标头。在这种情况下,请确保在图像上指定了标题Cache-Control: max-age=0(或者更有可能在包含图像集的文件夹中)。

通过设置max-age = 0,您将使浏览器尝试重新获取图像,但是它会通知服务器有关它在缓存中的任何现有版本的映像。这使得服务器有机会发送状态404,因为图像已被删除,304因为图像仍然存在且没有改变所以可以使用缓存版本或200因为图像已经改变,后者的响应将带有新版本。

答案 2 :(得分:0)

这是我的解决方案:

return new BitmapImage(new Uri(Mang.Communication.ServicePathUrl + "Icon.aspx?location=" + value.imageParameter + "&originalSize=true" +  "?" +  System.DateTime.Now.ToString(), UriKind.Absolute));