加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

使用asp.net mvc 3中的Last-Modified标头和OutputCacheAttribute

发布时间:2020-12-16 09:38:32 所属栏目:asp.Net 来源:网络整理
导读:编辑 我想在客户端缓存图像并知道在mvc 3中有不同的方法:(如果我错了,请纠正我) 1)您可以使用OutputCacheAttribute,它可以在Expires http标头的帮助下工作.但它将返回304 Not Modified,除非时间到期(即使图像已更改). 2)避免替换过时的图像您可以使用Last-Mo
编辑

我想在客户端缓存图像并知道在mvc 3中有不同的方法:(如果我错了,请纠正我)

1)您可以使用OutputCacheAttribute,它可以在Expires http标头的帮助下工作.但它将返回304 Not Modified,除非时间到期(即使图像已更改).

2)避免替换过时的图像您可以使用Last-Modified http标头(使用OutputCacheAttribute).在这种情况下,浏览器使用If-Modified-Since http标头将请求发送到服务器.在服务器上您验证对象是否仍然有效,如果是,您只需返回Last-Modified http标头(浏览器从本地缓存中获取图像);如果对象已被修改您以200 OK状态返回它.
因此,浏览器需要每次从服务器自己的缓存中获取图像之前将请求发送到服务器. Here is the example –

3)还有另一种方式(因为我被告知在我的情况下正确的方式,因为图像将很少改变…无论如何,我需要实现这一点):添加修改日期到图像网址并设置缓存与永恒期满(1年或以上).如果图像已更改您应该发送新版本的新网址.

这是代码:

public class LastModifiedCacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result is FilePathResult)
        {
            var result = (FilePathResult)filterContext.Result;
            var lastModify = File.GetLastWriteTime(result.FileName);
            if (!HasModification(filterContext.RequestContext,lastModify))
                filterContext.Result = NotModified(filterContext.RequestContext,lastModify);
            SetLastModifiedDate(filterContext.RequestContext,lastModify);
        }
        base.OnActionExecuted(filterContext);
    }

    private static void SetLastModifiedDate(RequestContext requestContext,DateTime modificationDate)
    {
        requestContext.HttpContext.Response.Cache.SetLastModified(modificationDate);
    }

    private static bool HasModification(RequestContext context,DateTime modificationDate)
    {
        var headerValue = context.HttpContext.Request.Headers["If-Modified-Since"];
        if (headerValue == null)
            return true;
        var modifiedSince = DateTime.Parse(headerValue).ToLocalTime();
        return modifiedSince < modificationDate;
    }

    private static ActionResult NotModified(RequestContext response,DateTime lastModificationDate)
    {
        response.HttpContext.Response.Cache.SetLastModified(lastModificationDate);
        return new HttpStatusCodeResult(304,"Page has not been modified");
    }
}

我在Global.asax中注册了LastModifiedCacheAttribute,并将以下OutputCacheAttribute应用于我的action方法.

[HttpGet,OutputCache(Duration = 3600,Location = OutputCacheLocation.Client,VaryByParam = "productId")]
public FilePathResult GetImage(int productId)
{ // some code }

如果我使用上面的代码似乎浏览器不向服务器发送请求,而只是从缓存中获取图像,除非持续时间没有结束. (当我更改图像时,浏览器不显示新版本)

问题:

1)如何实现第三种方法,以便浏览器从客户端缓存中获取图像(并且每次想要图像时都不会将响应发送到服务器),除非图像被修改?
编辑:实际代码将不胜感激.

2)在上面的代码中,第一个图像请求的时间被写入Last-Modified(不知道为什么).如何将文件的修改日期写入Last-Modified?
编辑:这个问题涉及第二种方法.此外,如果我只在客户端上缓存并使用Last-Modified实现,那么只有当我按F5时才会获得304 Not Modified状态.如果我重新输入相同的网址,我将获得200 OK.如果我在不使用Last-Modified的情况下缓存在客户端上,无论如何都会返回200 OK.怎么解释这个?

解决方法

您可以考虑使用ETags( http://en.wikipedia.org/wiki/HTTP_ETag),这是我第一次想到阅读您的问题.

你也可以看看这里:Set ETag for FileResult – MVC 3

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读