ASP.NET Core 5(Razor)中如何从中间件获取Page Model的类型
Razor页面自定义中间件获取Page Model类型方案
核心前提:调整中间件注册顺序
你之前拿不到端点相关信息,大概率是中间件注册顺序不对。必须将你的自定义中间件放在UseRouting()之后、UseAuthorization()/MapRazorPages()之前,路由系统会在UseRouting()执行时完成端点解析,此时才能拿到Razor页面对应的元数据。
注册示例:
var builder = WebApplication.CreateBuilder(args); // 其他服务注册逻辑 builder.Services.AddRazorPages(); var app = builder.Build(); // 异常处理、静态文件、Https跳转等基础中间件 app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseExceptionHandler("/Error"); app.UseRouting(); // 路由解析,填充Endpoint信息 // 你的自定义中间件注册位置 app.UseMiddleware<RazorPageCheckMiddleware>(); app.UseAuthorization(); app.MapRazorPages(); app.Run();
中间件获取Page Model与特性校验实现
从已解析的端点元数据中提取PageActionDescriptor对象,即可直接获取对应Page Model的类型,再做[AllowAnonymous]特性判断即可:
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Authorization; public class RazorPageCheckMiddleware { private readonly RequestDelegate _next; public RazorPageCheckMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { var endpoint = context.GetEndpoint(); if (endpoint == null) { await _next(context); return; } // 提取Razor页面专属描述符 var pageDescriptor = endpoint.Metadata.GetMetadata<PageActionDescriptor>(); // 非Razor页面请求直接跳过 if (pageDescriptor == null) { await _next(context); return; } // 获取Page Model类型 var pageModelType = pageDescriptor.ModelTypeInfo.AsType(); // 判断是否标记了[AllowAnonymous] bool isAllowAnonymous = Attribute.IsDefined(pageModelType, typeof(AllowAnonymousAttribute)); if (!isAllowAnonymous) { // 此处直接复用你现有中间件的校验逻辑即可,无需改造为过滤器 } await _next(context); } }
注意事项
- 非Razor页面的请求(如静态资源、Web API接口)不会进入你的专属校验逻辑,不会影响现有其他功能
- 如果需要读取Razor页面的路由规则、相对路径等信息,也可以直接从
pageDescriptor的对应属性中获取 - 若你的
[AllowAnonymous]是标记在Razor页面的@attribute指令中而非Page Model类上,只需把上述校验的ModelTypeInfo替换为PageTypeInfo即可
内容的提问来源于stack exchange,提问作者Lázár Zsolt
相关产品推荐
相关产品推荐

