【问题标题】:Is there any way to force WebClient, not return cached data?有没有办法强制 WebClient,不返回缓存的数据?
【发布时间】:2011-01-26 09:10:25
【问题描述】:

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

        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 不会继续给我它的缓存副本?

【问题讨论】:

  • WebClient 不返回缓存数据。它返回服务器和任何缓存代理提供的数据。您必须让服务器不要向您发送您不想接收的数据。
  • @John:实际上在这种情况下,我怀疑根本没有实际请求。 WebClient 将使用浏览器堆栈,它将从本地缓存中传递内容,而不是向服务器发出请求。
  • @Anthony:我不知道它重用了这么多浏览器堆栈。你有参考说它是这样做的吗?
  • @John:默认情况下,Silverlights HTTP 堆栈与主机浏览器高度集成,请参阅:- msdn.microsoft.com/en-us/library/dd920295(v=VS.95).aspxmsdn.microsoft.com/en-us/library/cc838250(v=VS.95).aspx
  • @Anthony:抱歉,我错过了“silverlight”标签。

标签: silverlight caching webclient


【解决方案1】:

这是我的解决方案:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这种假设他可以控制他正在请求的服务器。我想,鉴于他正在使用网络客户端获取图像,他更有可能使用 WebClient 将它们拉下来,特别是因为它们是远程/不受他控制的?
    • @Brian:并不是要吹毛求疵,但他说“我注意到如果我删除了图像”,这意味着他可以控制网络服务器。
    【解决方案3】:

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

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

    【讨论】:

    • 随机查询字符串的问题是它总是会强制下载资源,因为从 HTTP 的角度来看它是一个不同的资源,它无法确定当前缓存的版本是当前最新版本,可以重复使用。这会对应用程序的性能产生不利影响。
    • +1 用于随机查询字符串的想法,只要性能不是如上所述的问题,这似乎会迫使它始终为您提供准确的响应,您可以将其设置为在您开发时,它包含随机字符串,然后当您的网站上线并设置数据时,您可以将其删除以获得更好的性能
    • 爱德华,这正是我倾向于做的事情。我通常使用 String.Format("{0}{1}", url, (HttpContext.Current.IsDebuggingEnabled) ? randomParam : String.Empty)。我发现这可以帮助我绕过非 ISAPI 注册元素(如 js 文件等)的 IIS 缓存。
    • 如果它有效,它就有效。就我个人而言,如果可能的话,我认为这是一个值得避免的丑陋黑客行为。但是,您是对的,如果您无法控制图像源站点并且您不信任站点自己的缓存规范(或者他们没有提供),那么您可能不得不求助于此。
    猜你喜欢
    • 2020-09-23
    • 1970-01-01
    • 2010-12-01
    • 2011-01-27
    • 2012-07-19
    • 1970-01-01
    • 2020-05-17
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多