Ali*_*ori 10 asp.net caching asp.net-core-mvc asp.net-core razor-pages
这是一个非常小的 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()
{
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用此代码,时间将每 30 秒更新一次,这是预期的:
<cache expires-after="TimeSpan.FromSeconds(30)">
<h1>
@DateTime.Now.ToString()
</h1>
</cache>
Run Code Online (Sandbox Code Playgroud)
但是,将ResponseCache属性添加到模型不会这样做:
[ResponseCache(Duration = 30)]
public class IndexModel : PageModel
Run Code Online (Sandbox Code Playgroud)
经过一些研究,似乎该属性只向客户端发送适当的标头,要求它缓存内容。如何将整个响应存储在内存中,以便当用户请求特定页面时,服务器只发送缓存的响应并消除再次计算结果的过程?
此外,使用<cache>标签助手,我找不到使缓存条目无效的方法。因此,对我而言,一种情况是将内存中的每个页面缓存 30 天,如果我在管理面板上更改某些内容,我将使该特定项目的缓存无效,以便下一个请求会产生新的结果。我曾经在 Asp.Net MVC 3+ 上这样做过,但在 Asp.Net Core 3.1 中找不到任何方法来实现相同的结果
编辑:不,它不起作用(我无法删除这个答案)。
浏览器通常在重新加载时添加缓存控制标头,以防止中间件提供缓存页面。
因此,它不起作用,而且我不知道除了使用特制请求的机器对机器请求之外,这还有什么用处。
使用允许显式设置请求标头的开发人员工具,例如 Fiddler 或 Postman。
我还没有测试它,但看起来“响应缓存中间件”可能是答案。
https://learn.microsoft.com/en-us/aspnet/core/performance/caching/response?view=aspnetcore-3.1
对于遵循 HTTP 1.1 缓存规范的服务器端缓存,请使用响应缓存中间件。中间件可以使用 ResponseCacheAttribute 属性来影响服务器端缓存行为。
ASP.NET Core 中的响应缓存中间件:
https://learn.microsoft.com/en-us/aspnet/core/performance/caching/middleware?view=aspnetcore-3.1
中间件确定响应何时可缓存、存储响应并提供来自缓存的响应。
不过,您并不总是能得到缓存的响应。
中间件遵循 HTTP 1.1 缓存规范的规则。这些规则要求缓存遵守客户端发送的有效缓存控制标头。根据该规范,客户端可以发出带有无缓存标头值的请求,并强制服务器为每个请求生成新的响应。目前,在使用中间件时,开发人员无法控制此缓存行为,因为中间件遵循官方缓存规范。
此外
仅应针对不会根据用户身份或用户是否登录而更改的内容启用缓存。
| 归档时间: |
|
| 查看次数: |
965 次 |
| 最近记录: |