Есть ли способ перехватить HTTP-запрос к несуществующему пользовательскому обработчику для Razor Pages в ASP.NET Core 2.1? - PullRequest
0 голосов
/ 07 февраля 2019

Я новичок в 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. Есть ли способ сделать это?

1 Ответ

0 голосов
/ 07 февраля 2019

Для этого вы можете использовать глобальный фильтр .

Как говорит Крис Пратт в своем комментарии, каркас вернется к выполнению обработчика OnGet по умолчанию, если не найден соответствующий именованный обработчик.Вы можете обнаружить это в переопределенном методе OnPageHandlerSelectionAsync в классе, который реализует IAsyncPageFilter.Грубо и готово, но что-то из следующих строк подойдет:

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());
})
...