代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

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

  •  9
  • Edward Tanguay  · 技术社区  · 15 年前

    我正在从Web服务器目录中检索图像,如下所示:

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

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

    当我在firefox中输入图片url时,我也看到了图片,但是我单击 Reload 它给了我一个适当的错误,图像不存在。然后,当我再次运行我的silverlight应用程序时,它也相应地给了我一个错误,即图像不存在,就好像浏览器清除了某个地方的缓存标志一样。

    然后我如何在代码中通过webclient进行“刷新”,以便如果服务器上突然不存在图像,silverlight不会继续给我它的缓存副本?

    3 回复  |  直到 12 年前
        1
  •  7
  •   Brian Scott    15 年前

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

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

        2
  •  4
  •   Edward Tanguay    15 年前

    您需要确定缓存策略是针对站点上的各种内容的。

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

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

        3
  •  0
  •   Andrew Barber Eric Lafortune    12 年前

    以下是我的解决方案:

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