有没有办法在 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());
})
我是 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());
})