是否可以使用WebClient从浏览器缓存中检索文件而无需检查文件的较新版本?

时间:2010-11-29 20:33:23

标签: .net silverlight internet-explorer wcf webclient

我在Silverlight应用程序中使用WebClient实例来检索要显示的图像文件。为了服务此应用程序,我已经设置了WCF REST服务。以下是我为该服务编写的一段代码:

DateTime modSince = WebOperationContext.Current.IncomingRequest.Headers[HttpRequestHeader.IfModifiedSince] 
    == null 
    ? DateTime.MinValue 
    : DateTime.Parse(WebOperationContext.Current.IncomingRequest.Headers[HttpRequestHeader.IfModifiedSince].ToString());

FileInfo fInfo = new FileInfo(filePath);

if (fInfo.LastWriteTime > modSince)
{
    WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.OK;
    WebOperationContext.Current.OutgoingResponse.LastModified = fInfo.LastWriteTime;
}
else
{
    WebOperationContext.Current.OutgoingResponse.SuppressEntityBody = true;
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotModified;
}

设置服务,使得在请求图像文件时,检查请求头的if-modified-since属性。如果此值小于上次修改文件的值,则返回该文件。否则,返回304消息。

我们有兴趣加快交易速度。由于图像很少(如果有的话)改变,因此希望在向服务器发出请求之前查找高速缓存以获得图像的副本,这将节省网络延迟。在尝试为IE实现此功能时,我已将“Internet临时文件”设置更改为“从不检查存储页面的较新版本”。当我在浏览器的地址栏中输入存储在缓存中的副本的图像的REST服务URL时,将从缓存中检索副本,而不调用服务器。但是,当URL作为WebClient的OpenReadAsync方法的参数输入时,GET请求将发送到服务器,从而产生304消息。

有没有办法在没有GET请求发送到服务器的情况下使用WebClient查找缓存?

2 个答案:

答案 0 :(得分:2)

您需要在WebClient上设置CahcePolicy:

WebClient wc = new WebClient();
wc.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.CacheIfAvailable);

默认使用Microsoft.Win32.WinInetCache,即IE的缓存管理器。


<强>更新

好吧,我没有意识到它是SL。在这种情况下,如果图像很小,我认为通过从服务器检索来简化事情更容易。如果文件很大,请公开一个方法以返回上次更改的日期,并使用独立存储实现本地缓存。

答案 1 :(得分:1)

您无法阻止Silverlight中的代码发出请求。 IE的“永不检查”设置仅在没有来自服务器的缓存控制指令时使用,我不建议您使用它。

我不确定您为什么要使用WCF Rest将图像传送到客户端,而不是简单地将图像放在服务器上的文件夹中并将其作为标准静态内容提取?

无论哪种方式,您的问题的正确方法是服务器通过在响应中包含Cache-Control标头来指定图像应如何缓存。像“Cache-Control:max-age = 86400”之类的东西。