Asp.net core 3.1 Razor Pages访问指定页面跳转至Index问题求助
问题排查结果
核心原因
- 全局缓存配置错误:你在自定义安全头中间件中为所有请求的响应都设置了
max-age=365天的强缓存规则,会导致浏览器第一次加载Index页面后,后续同域的页面请求优先走本地缓存,不会发送请求到服务端。你遇到的偶尔能正常触发Logout逻辑,基本是刚好缓存失效、或者你手动触发了强制刷新的情况。同时该缓存规则也会导致带查询参数的Index请求被缓存,服务端无法收到新的查询参数,自然拿到的是null值。 - Razor Pages路由本身无异常:ControlPanel、Error等页面可正常访问,说明路由注册逻辑是正常的,问题完全由缓存配置导致。
修复步骤
- 将静态资源的缓存规则从全局中间件剥离,仅对静态文件生效,删除全局中间件中以下缓存相关代码:
/// Cache control context.Response.GetTypedHeaders().CacheControl = new Microsoft.Net.Http.Headers.CacheControlHeaderValue() { Public = true, MaxAge = TimeSpan.FromDays(365) }; context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] = new string[] { "Accept-Encoding" };
修改UseStaticFiles配置,将缓存规则限定在静态资源上:
app.UseStaticFiles(new StaticFileOptions { OnPrepareResponse = ctx => { ctx.Context.Response.GetTypedHeaders().CacheControl = new Microsoft.Net.Http.Headers.CacheControlHeaderValue() { Public = true, MaxAge = TimeSpan.FromDays(365) }; ctx.Context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] = new string[] { "Accept-Encoding" }; } });
- 为动态Razor页面配置合适的缓存策略,对于需要实时响应的页面(比如Index、Logout),可以通过
ResponseCache特性单独设置禁用缓存:
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)] public class IndexModel : PageModel { // 原有逻辑 }
- 修复完成后清空浏览器现有缓存,或者使用无痕模式测试,避免之前的长缓存规则影响验证结果。
内容的提问来源于stack exchange,提问作者Xequtor
相关产品推荐
相关产品推荐

