有没有办法在 ASP.NET Core 2.1 中捕获对 Razor 页面不存在的自定义处理程序的 HTTP 请求?

Posted

技术标签:

【中文标题】有没有办法在 ASP.NET Core 2.1 中捕获对 Razor 页面不存在的自定义处理程序的 HTTP 请求?【英文标题】:Is there a way to catch a HTTP request to a non existing custom handler for Razor Pages in ASP.NET Core 2.1? 【发布时间】:2019-07-01 11:06:05 【问题描述】:

我是 Razor Pages 的新手,我对处理程序方法有疑问。假设我使用自定义处理程序调用页面,但忘记实现此特定处理程序,使用默认的 POST 或 GET 处理程序。有没有办法改变或抓住它?

假设我使用

向页面发出 HTTP-GET 请求
/xyz?handler=dostuff

但没有得到处理程序 OnGetDoStuff,默认处理程序 OnGet 将被执行。

public class XyzModel : PageModel

    public void OnGet()
    
    
    // missing handler public void OnGetDoStuff()...

我了解处理程序只是 GET 请求中的一个参数,因此我可以检查每个默认方法中的请求 url 以查看是否移交了自定义处理程序。但我想要一个 404 之类的东西。有没有办法做到这一点?

【问题讨论】:

我不完全确定,因为我自己没有尝试过。但是,鉴于处理程序作为查询字符串参数传递,Razor 页面可能会回退到 HTTP 方法的默认处理程序。如果是这种情况,那么您应该能够在 Request.Query 中查找处理程序并在这种情况下做任何您想做的事情。 【参考方案1】:

您可以为此使用global filter。

正如 Chris Pratt 在他的评论中所说,如果不存在匹配的命名处理程序,框架将回退到执行默认的 OnGet 处理程序。您可以在实现IAsyncPageFilter 的类中的重写OnPageHandlerSelectionAsync 方法中检测到这一点。粗略且准备就绪,但可以采用以下方式:

public class CustomPageFilter : IAsyncPageFilter

    public async Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
    
        var handler = context.HttpContext.Request.Query["handler"];
        if (handler.Count > 0)
        
            var handlerMethodName = handler.ToArray()[0].ToLower();
            var method = context.HandlerMethod.MethodInfo.Name.ToLower();
            if (!method.EndsWith(handlerMethodName))
            
                context.HttpContext.Response.StatusCode = 404;
            
        
        await Task.CompletedTask;
    

OnPageHandlerSelectionAsync 方法在选择处理程序方法后运行。这里的简单测试检查所选方法名称是否以传递给handler 查询字符串值的值结尾。如果没有,则缺少处理程序方法。

正如我链接到的文章所示,您在 ConfigureServices 方法中配置全局过滤器:

services.AddMvc(options =>

    options.Filters.Add(new CustomPageFilter());
)

【讨论】:

以上是关于有没有办法在 ASP.NET Core 2.1 中捕获对 Razor 页面不存在的自定义处理程序的 HTTP 请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 2.1 中使用自动完成输入引发模式

ASP.NET Core 2.1 显示用户和角色

没有指定 authenticationScheme,也没有找到 DefaultChallengeScheme - ASP.NET core 2.1

ASP Net Core 2.1 会话

如何在 ASP.NET Core 2.1 中获取客户端 IP 地址

有没有办法为 ASP.NET Core 中的内容设置通用根路径?