Asp.net mvc 4 asp mvc 4中HTTP缓存的工作原理

Asp.net mvc 4 asp mvc 4中HTTP缓存的工作原理,asp.net-mvc-4,http-headers,browser-cache,cache-control,outputcache,Asp.net Mvc 4,Http Headers,Browser Cache,Cache Control,Outputcache,我有一个返回SVG图像的控制器。因为我想有好的性能,我决定使用缓存 从我在网上读到的内容来看,一旦您使用HttpContext.Response.Cache.SetLastModified(date) 您可以使用HttpContext.request.Headers.Get(“如果自修改”)从浏览器请求它。比较这两个日期。如果它们相等,则表示图像尚未修改,因此您可以返回httpstatuscodesult(304,“未修改”) 但奇怪的事情正在发生,这是我的代码: [OutputCache(Du

我有一个返回SVG图像的控制器。因为我想有好的性能,我决定使用缓存

从我在网上读到的内容来看,一旦您使用
HttpContext.Response.Cache.SetLastModified(date)
您可以使用
HttpContext.request.Headers.Get(“如果自修改”)
从浏览器请求它。比较这两个日期。如果它们相等,则表示图像尚未修改,因此您可以返回
httpstatuscodesult(304,“未修改”)

但奇怪的事情正在发生,这是我的代码:

[OutputCache(Duration = 60, Location = OutputCacheLocation.Any, VaryByParam = "id")]
   public ActionResult GetSVGResources(string id)
    {

        DateTime lastModifiedDate = Assembly.GetAssembly(typeof(Resources)).GetLinkerTime();

        string rawIfModifiedSince = HttpContext.Request.Headers.Get("If-Modified-Since");

        if (string.IsNullOrEmpty(rawIfModifiedSince))
        {
            // Set Last Modified time
            HttpContext.Response.Cache.SetLastModified(lastModifiedDate);
        }
       else
        {
            DateTime ifModifiedSince = DateTime.Parse(rawIfModifiedSince);

            if (DateTime.Compare(lastModifiedDate, ifModifiedSince) == 0)
            {
                // The requested file has not changed
                return new HttpStatusCodeResult(304, "Not Modified");
            }

        }

        if (!id.Equals("null"))
            return new FileContentResult(Resources.getsvg(id), "image/svg+xml");
        else
           return null;
    }
正在发生的是函数
HttpContext.Response.Cache.SetLastModified(lastModifiedDate)
没有设置从浏览器返回的“If Modified-Since”,实际上函数
HttpContext.Request.Headers.Get(“If Modified-Since”)
retuns精确地显示了从上一次调用返回图像的时间
return new FileContentResult(Resources.getsvg(id),“image/svg+xml”)

所以我的问题是,

1-函数
HttpContext.Response.Cache.SetLastModified(lastModifiedDate)
精确设置了什么


2-我(服务器)如何设置浏览器返回的“如果修改自”

你似乎混淆了一堆相关但完全不同的概念

OutputCache
是服务器上基于内存的缓存。在那里缓存某些内容意味着,虽然它仍然存在于内存中并且还没有过时,但服务器可以放弃处理该操作,而只是返回先前已呈现的响应。客户根本不参与

HTTP缓存是服务器和客户端之间的交互。服务器发送一个
Last Modified
响应头,指示客户端上次更新资源的时间。如果自
请求头修改后,客户端将发送一个
,以指示服务器,如果资源未被修改,则无需将其作为响应的一部分发送。所有这些都可以节省一点带宽。请求仍然发出,响应仍然收到,但资源的实际数据(如SVG)不必通过管道传输

然后,还有基本的基于浏览器的缓存,它与HTTP缓存协同工作,但也可以在没有HTTP缓存的情况下工作。浏览器只需保存它下载的每个资源的副本。如果它仍然有那个副本,它就不会麻烦向服务器请求再次获取它。在这种情况下,甚至可能不会发出请求。但是,如果自
头被修改,浏览器也可能发送带有该
头的请求,以查看它所拥有的文件是否仍然“新鲜”。然后,如果它没有再次从服务器获取文件,它只使用其保存的副本

不管怎样,都是客户的问题。客户机可以配置为从不缓存,在这种情况下,无论资源是否已被修改,它都将始终请求资源,或者可以配置为始终使用缓存,甚至从不检查资源是否已更新

还有像代理这样的东西会使事情变得更加复杂,因为代理充当客户端,在最终用户的web浏览器或其他客户端对此事有发言权之前,可以随意选择缓存或不缓存


归根结底,由于服务器上的
,如果修改,则无法设置
,并且无法控制客户端是否在请求中发送它。当涉及到客户机的缓存形式时,客户机会随心所欲。

有趣的是,我不知道“outputcache”是否是服务器端基于内存的缓存。但是如何检查是否需要返回图像?因为“If Modified Since”返回的时间不是上次修改图像的时间。