使用asp.net mvc 3中的Last-Modified标头和OutputCacheAttribute
编辑
我想在客户端缓存图像并知道在mvc 3中有不同的方法:(如果我错了,请纠正我) 1)您可以使用OutputCacheAttribute,它可以在Expires http标头的帮助下工作.但它将返回304 Not Modified,除非时间到期(即使图像已更改). 2)避免替换过时的图像您可以使用Last-Modified http标头(使用OutputCacheAttribute).在这种情况下,浏览器使用If-Modified-Since http标头将请求发送到服务器.在服务器上您验证对象是否仍然有效,如果是,您只需返回Last-Modified http标头(浏览器从本地缓存中获取图像);如果对象已被修改您以200 OK状态返回它. 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? 解决方法
您可以考虑使用ETags(
http://en.wikipedia.org/wiki/HTTP_ETag),这是我第一次想到阅读您的问题.
你也可以看看这里:Set ETag for FileResult – MVC 3 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 在FileUpload Control中获取文件的扩展名
- asp.net-mvc – 使用Automapper返回IQueryable
- asp.net-mvc – MVC 3部分页面(Razor)和MVC 3视图页面与布局
- ASP.NET增删改
- asp.net – ScriptManager的EnablePartialRendering属性究竟
- asp.net-mvc-3 – MVC 3中的BeginRequest类过滤器?
- asp.net-mvc-3 – MVC 3 Razor EditorTemplate / DisplayTe
- asp.net-mvc – 如何在ASP.NET MVC中为自定义User对象实现I
- asp.net core 使用 signalR(二)
- asp.net – 在asp:按钮上的jQuery Click事件