【发布时间】:2020-05-09 15:10:09
【问题描述】:
这是一个非常小的 Razor 页面示例:
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<h1>
@DateTime.Now.ToString()
</h1>
//model
public class IndexModel : PageModel
{
private readonly ILogger<IndexModel> _logger;
public IndexModel(ILogger<IndexModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
如果我使用此代码,时间将每 30 秒更新一次,这是预期的:
<cache expires-after="TimeSpan.FromSeconds(30)">
<h1>
@DateTime.Now.ToString()
</h1>
</cache>
但是,将ResponseCache 属性添加到模型并不会这样做:
[ResponseCache(Duration = 30)]
public class IndexModel : PageModel
在做了一些研究之后,似乎该属性只向客户端发送了适当的标头,要求它缓存内容。如何将整个响应存储在内存中,以便当用户请求特定页面时,服务器只发送缓存的响应并消除再次计算结果的过程?
另外,使用<cache> 标签助手,我找不到使缓存条目无效的方法。因此,对我来说,一个场景是将每个页面在内存中缓存 30 天,如果我在管理面板上更改某些内容,我将使该特定项目的缓存无效,以便下一个请求会产生新的结果。我曾经在 Asp.Net MVC 3+ 上执行此操作,但在 Asp.Net Core 3.1 中找不到任何实现相同结果的方法
【问题讨论】:
-
你可以使用Redis,或者NCache来存储数据。在你可以使 redis 或 ncache 失效之后
-
您是否尝试过使用
标签的 vary-by 属性?对其引用的对象的任何更改都应使标记的缓存内容无效。 -
@Onur 我更喜欢使用框架本身,但如果不可能,请发布示例代码。谢谢
-
@JohnM 我可以使用它,但我想在它遇到“OnGetAsync()”之前缓存整个页面,因为大部分瓶颈来自从数据库获取数据,而不是渲染部分。虽然我可以缓存一个动作,但这似乎是个坏主意。此外,使用“vary-by”仍然会保留内存中的缓存数据而不是清除它。
-
@AlirezaNoori 我正在尝试github.com/VahidN/EFCoreSecondLevelCacheInterceptor 使用自动配置选项缓存数据库访问,以默认缓存所有内容,并在需要时让缓存失效。我希望它有效...
标签: asp.net asp.net-core caching asp.net-core-mvc razor-pages