Фильтры результатов

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 11.12.2019

Фильтры результатов (Result Filters) начинают выполняться после всех остальных фильтров. Они реализуют либо интерфейс IResultFilter, либо интерфейс IAsyncResultFilter. Фильтры результатов выполняются только тогда, когда выполнение метода завершилось успешно. Фильтры результатов могут применяться как к функционалу контроллера, так и к функционалу страниц Razor Pages.

Фильтры результатов не вызываются, если фильтры исключений обрабатывают исключение, но не устанавливают свойство Exception = null.

Как правило, фильтры результатов применяются, когда надо выполнить какую-то постобработку результата метода, отформатировать его.

К примеру, создадим простенький фильтр результатов. Пусть он получает время выполнения результата действий:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using System;

namespace FiltersApp.Filters
{
    public class DateTimeExecutionFilterAttribute : Attribute, IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            context.HttpContext.Response.Headers.Add("DateTime", DateTime.Now.ToString());
        }
        public void OnResultExecuted(ResultExecutedContext context)
        {
            
        }
    }
}

Метод OnResultExecuting() вызывается перед выполнением результата метода. В качестве параметра он получает объект ResultExecutingContext, представляющий контекст выполнения результата.

С помощью его свойства ResultExecutingContext.Result мы можем манипулировать результатом метода. В методе OnResultExecuting() можно предотвратить дальнейшее выполнение фильтров и обработку запроса, установив свойство ResultExecutingContext.Cancel равным true.

В данном же случае мы просто устанавливаем в отправляемых заголовках время начала выполнения для результата действий.

Метод OnResultExecuted() вызывается после выполнения результата действия. На этой стадии также можно предтвратить дальнейшую обработку запроса на других фильтрах, присвоив свойству ResultExecutedContext.Canceled значение true. В нашем же случае он ничего не делает.

Применение фильтра:

public class HomeController : Controller
{
    [DateTimeExecutionFilter]
    public IActionResult Index()
    {
        return View();
    }
}

И поcле выполнения метода Index в отправленных заголовках мы сможем увидеть время начала выполнения результата.

Фильтры результатов в ASP.NET Core MVC

Если при выполнении результата действия будет выброшено исключение, то свойство ResultExecutedContext.Exception будет иметь значение, отличное от null. Установка свойства ResultExecutedContext.Exception в null позволит некоторым образом обработать исключение и предотвратить выброс исключение на последующих этапах обработки запроса.

При добавлении каких-нибудь заголовков в ответ в фильтре результатов это следует делать до выполнения результата, то есть в методе OnResultExecuting(), а не в OnResultExecuted().

Теперь реализуем интерфейс IAsyncResultFilter:

public class ResultFilterAttribute : Attribute, IAsyncResultFilter
{
    public async Task OnResultExecutionAsync(ResultExecutingContext context, 
													ResultExecutionDelegate next)
    {
        context.HttpContext.Response.Headers.Add("DateTime", DateTime.Now.ToString());
        await next();
    }
}

При реализации интерфейса IAsyncResultFilter его единственный метод OnResultExecutionAsync объединяет возможности методов OnResultExecuting и OnResultExecuted. Вызов await next() для объекта ResultExecutionDelegate позволит выполнить последующие фильтры результатов или фильтры действий. Чтобы предотвратить дальнейшее выполнение фильтров в методе OnResultExecutionAsync() необходимо установить свойство ResultExecutingContext.Cancel равным true и не вызывать делегат ResultExectionDelegate.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850