首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTTP缓存在asp mvc 4中的工作方式

HTTP缓存在asp mvc 4中的工作方式
EN

Stack Overflow用户
提问于 2016-02-03 15:49:38
回答 1查看 994关注 0票数 0

我有一个返回SVG images.As的控制器,我想要有好的性能,我决定使用缓存

根据我在网上看到的内容,一旦您用HttpContext.Response.Cache.SetLastModified(date)设置了最后一次修改日期,您就可以使用HttpContext.Request.Headers.Get("If-Modified-Since")从浏览器中请求它。比较这两个日期。如果它们相等,这意味着图像没有被修改,因此您可以返回HttpStatusCodeResult(304, "Not Modified")

但有些奇怪的事情发生了,这是我的密码:

代码语言:javascript
复制
[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- image -因为”从浏览器返回,实际上,函数HttpContext.Request.Headers.Get("If-Modified-Since")会重新运行上次调用return new FileContentResult(Resources.getsvg(id), "image/svg+xml");返回图像的确切时间。

所以我的问题是,

1- HttpContext.Response.Cache.SetLastModified(lastModifiedDate)所设置的函数到底是什么?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-03 18:04:21

在这里,你似乎混淆了一堆相关但却完全不同的概念。

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

HTTP缓存是服务器和客户端之间的交互。服务器发送一个Last-Modified响应头,指示资源上次更新的时间。客户端发送一个If-Modified-Since请求头,以向服务器表明如果没有修改资源,就不必将其作为响应的一部分发送。这样做只会节省一点带宽。请求仍在发出,并且仍然收到响应,但资源的实际数据(如SVG)不必通过管道传输。

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

不管是哪种情况,都取决于客户。客户端可以配置为永不缓存,在这种情况下,无论资源是否已被修改,它都会请求资源,或者它可能被配置为始终使用缓存,甚至不会费心检查资源是否已经更新。

还有一些事情,比如代理,使事情变得更加复杂,因为代理充当客户端,在最终用户的web浏览器或其他客户端获得发言权之前,可以随意选择缓存或不缓存。

归根结底,您不能在服务器上设置If-Modified-Since,也无法控制客户端是否在请求中发送它。当涉及到客户端的缓存形式时,您会遇到客户端的突发事件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35181539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档