我有一个自定义的处理程序,这是返回的图像来浏览器。

图像是获取从一个数据库。

由于某些原因的图像不是缓存通过浏览器,我想知道如果有人可能会能够发现我的缺失,以下代码:

HttpContext.Current.Response.BinaryWrite(imageBytes);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
Context.Current.Response.Cache.SetAllowResponseInBrowserHistory(true);
if(imgRepGetCache.DateCached.HasValue)
    HttpContext.Current.Response.Cache.SetLastModified(imgRepGetCache.DateCached.Value);
HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddDays(2));
HttpContext.Current.Response.ContentType = "image/jpeg";

或者如果我完全缺点以某种方式并没有在其他地方,我需要看看。

编辑: 按请求的更多信息:

  • URL总是相同的
  • 我测试载有相同文件的通过标准IIS管和我的管在同一浏览器上。一个载荷,通过IIS通常是缓存,我的文件不是。

编辑2: 经过检查HTTP请求/回应在正常IIS路线,我认为这东西做的ETag。ETag(而我是新来的只是现在)似乎是一种校验的文件。在随后请求通过浏览器ETag发送,如果服务器找到ETag没有改变然后它返回304-不行修改。一切都好!但我现在设置ETag使用:

HttpContext.Current.Response.Cache.SetETag(imgRepGetCache.DateCached.ToString());

但是它不会出现在响应。接近...接下来会发生什么?

编辑3: 我在结束后,利用萤火虫一些HTTP检查的乐趣。我发布我的解决方案如下。

有帮助吗?

解决方案

好吧,我固定它。

这里是我有没有其他任何人和我自己的未来参考:

// Check for repeated request for the same image from a browser
if (HttpContext.Current.Request.Headers.Get("If-None-Match") == imgRepGetCache.DateCached.Value.ToString())
{
    // Return 304 - Not Modified
    HttpContext.Current.Response.Status = "304 Not Modified";
}
else
{
    if (imgRepGetCache.DateCached.HasValue)
        HttpContext.Current.Response.Headers.Set("Etag", imgRepGetCache.DateCached.Value.ToString());
    // ... do my other stuff here
}

工作的一个魅力!

如果有人点的任何潜在的问题,在这里,让我知道这样我就可以更新这一点。

抢先一个明显的一个-我可以100%依赖于日期串识别的图像是否是新的或不能(在我的特别方案).

其他提示

你不说任何事在你的文章有关,但是这一https://地址?浏览器不缓存图片和网页https网站由于安全原因。

你需要的东西去担心中产生的响应是:

  • ETag
  • 过期

事情你需要担心在接收要求是:

  • 最后的修改
  • 如果匹配
  • 如果没有匹配的
  • 如果修改的-因为
  • 如果未经修改的-因为
  • 除非修改的-因为

你可能还需要担心如下http方法:

  • 获得

这里是一个解决方案,应该是很容易的重构,以适合你的需要:http://code.google.com/p/talifun-web/wiki/StaticFileHandler

它会读取文件的文件系统和它们的地方,他们成为一个高速缓冲存储器,因此只是改变它以从中读取的数据库。应该是一个容易的工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top