gpt4 book ai didi

asp.net - 使 asp.net mvc 输出缓存的部分无效 - 具有不同的粒度级别

转载 作者:行者123 更新时间:2023-12-01 01:33:21 25 4
gpt4 key购买 nike

我对 HttpResponse.RemoveOutputCacheItem() 提供的粒度有点困惑称呼。我有兴趣在动态生成的图像上执行一些输出缓存,并希望至少使用参数来改变输出缓存(为了参数,我们将它们称为“id”和“size”)。

因此,例如:

/Image/User?id=1
/Image/User?id=1&size=1
/Image/User?id=1&size=2


将被单独缓存。

当给定用户更改他们的图片时;我想使该用户 ID 的所有输出缓存项无效(无论大小)。 This question回答我关于单个特定参数的问题。但是..如何在不考虑大小参数的情况下为用户刷新所有缓存的响应? (假设我不会提前知道“大小”的所有可能值)。

理想情况下,我想做类似的事情:
HttpResponse.RemoveOutputCacheItem("/Image/User?id=1&size=*"); //wishful thinking
任何人都可以指出我正确的方向吗?

编辑

@JcMalta 提出了一个有前途的解决方案,但是我找不到为输出缓存中的项目公开的合适集合。一个可行的解决方案可能包括一个类似于他提议的操作,如果它存在于某处。

最佳答案

输出缓存有一个“缓存依赖项”的概念,这可能正是您要寻找的。

.NET 有一个 FileCacheDependency,这意味着如果磁盘上的文件发生更改,缓存项会自动失效,还有一个 SqlCacheDependency,它在 MSSQL 数据库中的数据更改时使对象失效。您还可以编写自定义缓存依赖项。

HttpResponse 有一堆名为 Add*Dependency/ies 的方法可以让您使用它。

例如,如果您的图像基于磁盘上的文件,则处理调整大小的图像的处理程序可能会说:

HttpResponse.AddFileDependency(@"C:\images\user" + userId + ".jpg");

这会为您的响应注册一个依赖项。当您的响应被添加到输出缓存时,任何依赖项都会随之而来。当依赖项发生变化时,缓存项会自动失效。

如果您的图像基于文件或 SQL 数据,这可能适合您开箱即用。

您还可以使用 HttpResponse.AddCacheItemDependency 使一个缓存项依赖于另一个缓存项。如果您知道您的原始图像 URL "/Image/User?id=1"将始终被缓存,那么您可以使调整大小的图像依赖于原始图像,并且原始图像上的 HttpResponse.RemoveOutputCacheItem() 将清除所有这些图像。如果原始图像并不总是被缓存(也许没有人请求原始图像,只有缩略图),那么我认为这行不通。

内置缓存依赖项起作用的原因是 Windows 和 SQL Server 都有内置 API 来通知文件或数据的更改。内置的缓存依赖是这些的包装器。但是,如果这些都不适合,您的最后一种方法是为您自己的目的实现类似的东西。

基本思想(未经测试)是继承CacheDependency,我们称之为PictureCacheDependency。

您需要设置某种监听器/观察器模式,以便当用户编辑他们的图片时,图片编辑代码可以告诉任何相关的 PictureCacheDependency 对象图片已更改。发生这种情况时,PictureCacheDependency 应调用 base.NotifyDependencyChanged,框架将负责其余的工作。

您可能让 PictureCacheDependency 构造函数在静态事件字典中注册自己,使用用户 ID 作为键。无论您如何处理它,请务必覆盖 CacheDependency.DependencyDispose 以释放任何引用,否则您将泄漏内存。

关于asp.net - 使 asp.net mvc 输出缓存的部分无效 - 具有不同的粒度级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3479803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com