有没有办法在 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 中使用自动完成输入引发模式
没有指定 authenticationScheme,也没有找到 DefaultChallengeScheme - ASP.NET core 2.1