Asp.net mvc ASP.NET MVC 5:如何强制重新计算图像ETAG?

Asp.net mvc ASP.NET MVC 5:如何强制重新计算图像ETAG?,asp.net-mvc,etag,Asp.net Mvc,Etag,我正在开发一个网站,用户可能会改变他的个人资料图像。 此配置文件图像具有固定名称,例如“profile######.jpg”(其中#####对应于用户的配置文件id) 换句话说,如果用户的配置文件id为“123”,则图像名称将始终为:“profile123.jpg” 我面临的问题是,当用户更改其配置文件映像时,下次显示页面时不会刷新映像的新版本(仍然使用profile123.jpg的“旧”版本(从磁盘缓存) 看看网络通信,我有以下几点: profile123.jpg状态200类型jpeg ETa

我正在开发一个网站,用户可能会改变他的个人资料图像。 此配置文件图像具有固定名称,例如“profile######.jpg”(其中#####对应于用户的配置文件id)

换句话说,如果用户的配置文件id为“123”,则图像名称将始终为:“profile123.jpg”

我面临的问题是,当用户更改其配置文件映像时,下次显示页面时不会刷新映像的新版本(仍然使用profile123.jpg的“旧”版本(从磁盘缓存)

看看网络通信,我有以下几点:

profile123.jpg状态200类型jpeg ETag“e5b8c99974a3d31:0”

当我直接将图像源(在Chrome开发者工具/元素窗格中)更改为“profile123.jpg?some_sand”时,我获得:

profile123.jpg?一些沙盘状态200类型jpeg ETag“2479c550dcad31:0”

我有正确的个人资料图像显示

现在的问题是:

我使用的是.NET Framework 4.5.2 MVC 5(不是ASP.NET Core

如何在静态文件(如图像)上设置正确的ETag过滤器,以确保每次更改图像(保持其名称不变)时,都会下载并显示新版本


非常感谢

如果您创建了一个可以从Razor视图访问的类(通过确保其名称空间在View web.config中被引用),如下所示:-

public class CacheBreaker
{
    public static string VersionTag(string rootRelativePath)
    {
        if (HttpRuntime.Cache[rootRelativePath] == null)
        {
            var path = HostingEnvironment.MapPath("~" + rootRelativePath);
            if (!File.Exists(path))
            {
                return rootRelativePath;
            }

            var result = rootRelativePath + "?v=" + Encryption.GenerateMD5(File.GetLastWriteTime(path).Ticks.ToString());
            HttpRuntime.Cache.Insert(rootRelativePath, result, new CacheDependency(path));
        }

        return HttpRuntime.Cache[rootRelativePath] as string;
    }
}
您可以在视图中使用此引用为图像生成指纹:

<img src="@CacheBreaker.VersionTag(Url.Content("~/Path/To/Image/profile123.jpg"))" />

这将产生:

<img src="/Path/To/Image/profile123.jpg?v=5276dc5d07eaf51013a48a1e539def2b">

它将在每次图像更改时更新


(此代码是a中代码的修改版本,但基于此,您可以找到此方法背后原理的更多细节。)

与其使用
profile123.jpg
,不如使用
profile{timestampwhereprofilelastdated}这样的格式.jpg
?用户表中可能需要一个单独的列来存储配置文件图片名称(如果您当前仅附加用户id)