【发布时间】:2020-10-20 00:05:12
【问题描述】:
我对 ASP.NET Core 3 比较陌生,我正在围绕 CMS 构建一个简单的概念证明。我试图证明我们能够缓存静态内容(.jpg、.png 等),但阻止缓存动态(从数据库传递到模型的内容)。静态内容似乎工作正常。但是,即使响应标头设置正确,动态内容也会被缓存。
从 Microsoft Edge 开发人员工具中看到的我的响应标头是:
缓存控制:无缓存、无存储、必须重新验证 内容类型:文本/html;字符集=utf-8 日期:2020 年 6 月 29 日星期一 18:25:58 GMT 过期:0 杂注:无缓存 服务器:红隼 状态:200
此时,我没有使用
app.UseResponseCaching();
我只将它用于 Startup.cs 中的静态文件
app.UseStaticFiles(new StaticFileOptions // for wwwroot files
{
OnPrepareResponse = (context) =>
{
var headers = context.Context.Response.GetTypedHeaders();
headers.CacheControl = new CacheControlHeaderValue
{
Public = true,
MaxAge = TimeSpan.FromDays(30)
};
}
});
还有这个
services.AddMvc(options =>
{
options.Conventions.Add(new RouteTokenTransformerConvention(
new SlugifyParameterTransformer()));
options.CacheProfiles.Add("Default0", new CacheProfile()
{
NoStore = true,
Location = ResponseCacheLocation.None,
Duration = 0
});
})
...将此添加到我的 Controller 类中
[ResponseCache(CacheProfileName = "Default0")]
public class CmsController : CmsControllerBase<CmsPageModel>
...为了更好的衡量,我还直接将它放在了我的视图中:
@using Microsoft.Net.Http.Headers;
@using Microsoft.AspNetCore.Http;
@model CMS.Web.Models.CmsPageModel
@{
this.Context.Response.Headers[HeaderNames.CacheControl] = "no-cache, no-store, must-revalidate";
this.Context.Response.Headers[HeaderNames.Expires] = "0";
this.Context.Response.Headers[HeaderNames.Pragma] = "no-cache";
}
我在浏览器上按了 F5 几次,无论我做什么,相同的缓存内容都会返回,直到我重新构建应用程序并重新启动它。有什么想法的程序员朋友吗?
【问题讨论】:
-
您能告诉我哪些缓存内容会返回吗?您是否在您的 asp.net 核心应用程序中使用了内存缓存?如果可能,请更新相关代码。
-
虽然我使用了一些内存缓存(在这篇文章之前),但我已经删除了它。我不知道我的代码中正在执行任何其他显式缓存。正在缓存的内容是从数据库返回的基本 HTML 内容 - 请注意,我没有使用任何查询缓存。我使用 EF Core 作为 ORM,但同样,我没有在那里使用任何显式缓存。我想知道某处是否发生了一些隐式缓存......
-
您的意思是您的浏览器中已经缓存了 MVC 主页索引操作的响应?
-
我不清楚究竟什么会被缓存,因为我对缓存的理解表明页面上显示的内容不应该被缓存。但是,结果是响应中显示的内容似乎以某种方式被缓存。无论是响应还是浏览器,我都不清楚。可能是时候对缓存进行概念验证了:(
标签: c# asp.net-core caching browser