【问题标题】:MVC database images aren't being cachedMVC 数据库图像没有被缓存
【发布时间】:2017-09-09 00:41:12
【问题描述】:

我将图像保存在我的数据库中,并使用以下代码检索它们

 var base64 = Convert.ToBase64String(image.Content);
 var imgSrc = String.Format("data:image/gif;base64,{0}", base64); 

 <div class="img">
   <a><img src="@imgSrc"></a>
 </div>

问题是,每次我刷新页面时,它们都会被再次下载。如何将它们存储在缓存中?

【问题讨论】:

  • 如果您使用OutputCacheAttribute 标记您的操作并提供缓存响应的持续时间,那么浏览器将缓存您的视图内容。
  • 假设您将图像(base64 编码)嵌入到您提供给浏览器的页面中,浏览器无法缓存单个图像(它可以缓存请求的整个结果,而不仅仅是其中的一部分因为您的base64图像在这种情况下。如果您强制浏览器要求单独的资源(如在常见的&lt;img src="something"&gt;标签中,您可以在响应头中设置缓存属性

标签: c# asp.net-mvc image


【解决方案1】:

Base64 图像不能被客户端浏览器缓存,因为图像 data 本身嵌入在 src 中,这与可以通过 HTTP 请求请求的 resource 不同。 p>

场景 A(“正常”图像):

  1. 在浏览器中加载页面
  2. 浏览器读取图片标签并请求@“src”获取资源
  3. Web 服务器通过提供 资源 来响应请求
  4. 浏览器渲染图像

场景 B(base64 图像):

  1. 在浏览器中加载页面
  2. 浏览器读取图像标签,并且由于 base64 数据 已经描述了图像的外观,浏览器会愉快地呈现它,而无需再次向网络服务器发出请求。

提示:您可以尝试通过右键单击“另存为..”来保存页面并观察输出。 base64 图像作为 data 本身嵌入到 html 中,而不是作为另一个文件夹中的 resource

P/S:@mmushtaq 提到的缓存方法是服务器端缓存,如果您通过 ActionResult 检索 base64 数据image.Content,可能会很有用。

【讨论】:

    【解决方案2】:
        <staticContent>
    <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365:00:00" />
    </staticContent>
    

    在 system.webServer 内的 Web.config 文件中添加此行以进行静态内容缓存,并在操作中使用 ETag 过滤器。

    希望这个缓存过程对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 2012-08-28
      相关资源
      最近更新 更多