有没有办法在 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?

我是 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 的东西。有什么办法可以做到这一点吗?

您可以为此使用 global filter

正如 Chris Pratt 在他的评论中所说,如果不存在匹配的命名处理程序,框架将回退到执行默认的 OnGet 处理程序。您可以在实现 IAsyncPageFilter 的 class 中的覆盖 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());
})