asp.net mvc Action直接返回图片不被浏览器缓存


背景

网站开发中图片返回采用后台返回File的方式,代码如下

C# 全选
public class ImagesController : ControllerBase
{
	/// <summary>
	/// 返回图片
	/// </summary>
	/// <returns></returns>
	public IActionResult Index(string tag, string fileName, string extension)
	{
		string _imgFileName = System.IO.Path.Combine(PathProvider.GetRootPath(), "wwwroot\\images", tag, fileName + "." + extension);
		if (System.IO.File.Exists(_imgFileName))
		{
			var image = System.IO.File.OpenRead(_imgFileName);
			return File(image, "image/" + extension);
		}
	}
}

问题

浏览器跟踪时发现每次刷新页面,图片都会重新请求,而不是向其他静态图片那样,浏览器缓存

通过接口Action返回的图片

asp.net mvc Action直接返回图片不被浏览器缓存

正常的静态图片+缓存(期望达到的效果)

asp.net mvc Action直接返回图片不被浏览器缓存

解决方案

参考文章: https://www.yesdotnet.com/archive/post/1641639549.html

通过浏览器跟踪得到,静态文件,IIS返回的响应头中有一个max-age=2592000

asp.net mvc Action直接返回图片不被浏览器缓存

因此我们可以在控制器加一个特性ResponseCache,然后设置Duration值为 2592000

Action增加一个特性:

C# 全选
[ResponseCache(Duration = 2592000)]

请求前配合检查是否更改,如果没有更改,返回304

C# 全选
if (!String.IsNullOrEmpty(Request.Headers["If-Modified-Since"]))
{
	Response.StatusCode = 304;
	return Content(String.Empty);
}

 

C# 全选
public class ImagesController : ControllerBase
{
	/// <summary>
	/// 返回图片
	/// </summary>
	/// <returns></returns>
    [ResponseCache(Duration = 2592000)]
	public IActionResult Index(string tag, string fileName, string extension)
	{
		if (!String.IsNullOrEmpty(Request.Headers["If-Modified-Since"]))
		{
			Response.StatusCode = 304;
			return Content(String.Empty);
		}
		
		string _imgFileName = System.IO.Path.Combine(PathProvider.GetRootPath(), "wwwroot\\images", tag, fileName + "." + extension);
		if (System.IO.File.Exists(_imgFileName))
		{
			var image = System.IO.File.OpenRead(_imgFileName);
			return File(image, "image/" + extension);
		}
	}
}    

然后再次测试,发现图片已经能够正常被缓存

asp.net mvc Action直接返回图片不被浏览器缓存

 

其他延申

同理,在U-CMS系统中,把用户自定义的CSS样式和JS也都添加了缓存支持处理

asp.net mvc Action直接返回图片不被浏览器缓存

asp.net mvc Action直接返回图片不被浏览器缓存

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
管理员
上一篇:.NET Core ResponseCache 浏览器缓存
下一篇:asp.net - 在 ASP.NET Core MVC 中嵌套 TagHelper
评论列表

发表评论

评论内容
昵称:
关联文章

asp.net mvc Action直接返回图片浏览器缓存
.NET Core ResponseCache 浏览器缓存
ASP.NET MVCASP.NET Core MVC中获取当前URL/Controller/Action
ASP.NET MVC快速入门(一)
VS调试运行ASP.NET MVC项目,上传静态资源图片404问题,Debug路径
ASP.NET MVC使用@Url.Action 多个参数中间&URL编码了
ASP.NET Core MVC 在过滤器ActionFilter中保存页面的生成的html静态页面文件
ASP.NET+MVC入门踩坑笔记 (一) 创建项目 项目配置运行 以及简单的Api搭建
从数据库或者其他位置加载ASP.NET MVC Views 视图 数据库中加载 cshtml
ASP.NET Core MVC中的路由约束
使用.NET 6开发TodoList应用(22)——实现缓存
ASP.NET Core统一接口返回模型
asp.net - 在 ASP.NET Core MVC 中嵌套 TagHelper
asp.net core mvc修改cshtml试图热加载动态更新
C# asp.net mvc 创建虚拟目录
asp.net core MVC路由添加.html伪静态url时报错
Python Selenium使用火狐浏览器驱动
Python Selenium 爬虫如何隐藏Headles-Chrome检测出来 避免检测
.net core MVC页面源码文件中文编码
ASP.NET Core官网教程,资料查找

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码