ASP .NET Core - Implementando Filtros - II

 Neste artigo eu mostrar como implementar filtros em aplicações ASP .NET Core MVC.

Eu já apresentei o conceito de filtros na ASP .NET Core, veja neste artigo :  ASP .NET Core - Apresentando Filtros

Hoje vamos implementar um filtro do tipo ActionFilter chamado DuracaoActionFilter que vai permitir calcular o tempo gasto na execução de uma Action. Este filtro é um filtro síncrono.

Vou partir de uma aplicação ASP .NET Core pronta chamada AspCoreMvc_Filtros que gerencia informações de autores usando o EF Core onde temos um controlador HomeController do tipo MVC e uma Web API AutoresControllers.

Dessa forma vou mostrar como criar o filtro nesta aplicação e como aplicá-lo tanto no controlador MVC como na Web API.

Implementando o ActionFilter DuracaoActionFilter

Vamos iniciar criando um filtro do tipo ActionFilter cujo objetivo vai ser calcular o tempo gasto na execução de cada Action da aplicação.

Para isso vamos usar o filtro para executar um código antes e depois da execução da Action usando a classe StopWatch para medir o tempo gasto.

Abrindo o projeto AspCoreMvc_Filtros no VS 2017 Community e a seguir crie uma pasta chamada Filtros no projeto via menu Project -> New Folder;

Crie na pasta
Filtros a classe DuracaoActionFilter com o código abaixo:

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

namespace AspCoreMvc_Filtros.Filtros
{
    public class
DuracaoActionFilter : IActionFilter
    {
        private
Stopwatch _stopwatch;

        public void OnActionExecuting(ActionExecutingContext context)
        {
            _stopwatch = Stopwatch.StartNew();
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
            var duracaoDaAction = _stopwatch.ElapsedMilliseconds;
            _stopwatch.Stop();

            //adiciona o tempo calculado ao viewdata na viewresult
            ViewResult result = context.Result as ViewResult;
            if (result != null)
            {
                result.
ViewData["duracaoDaAction"] = duracaoDaAction;
            }
        }
    }
}

O código cria uma instância da classe StopWatch e antes da Action executar inicia o cálculo do tempo definindo no método OnActionExcecuting o código :

          _stopwatch = Stopwatch.StartNew();

Depois que Action executar, calculamos o tempo gasto e encerramos definindo no método OnActionExecuted o código:

         var duracaoDaAction = _stopwatch.ElapsedMilliseconds;
        _stopwatch.Stop();

E a seguir atribuimos o valor a um ViewData que iremos exibir na View :       

        ViewResult result = context.Result as ViewResult;

         if (result != null)
         {
             result.ViewData["duracaoDaAction"] = duracaoDaAction;
         }

Pronto. Nosso filtro esta criado e pronto para ser usado.

Definindo o Escopo do filtro

O filtro criado deverá ser aplicado a todos os métodos Actions de todos os controladores da aplicação. Logo deverá ser aplicado globalmente.

Para isso abra o arquivo Startup.cs e no método ConfigureServices inclua o código abaixo destacado em azul:

       public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<AutorDbContext>(options =>
              options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

            services.AddScoped<IAutorRepositorio, AutorRepositorio>();

            services.AddMvc(options=>
                options.Filters.Add(typeof(DuracaoActionFilter)));
            }

        }

Definimos o filtro DuracaoActionFilter globalmente registrando-o como um tipo. Outra opção seria usar uma instância :

  services.AddMvc(options=>
                options.Filters.Add( new DuracaoActionFilter()));
            }

Agora para exibir o tempo gasto pela execução de uma Action basta usar a propriedade ViewData["duracaoDaAction"] definida na view.

Como exemplo vamos exibir este valor na view Index.cshtml.

Para isso altere o código da view Index.cshtm conforme a seguir:

<html>
<head>
    <title>Index</title>
</head>
<body>
    <div>
        <h1>Duração da Action Index</h1>
        @ViewData["duracaoDaAction"] milisegundos (DuracaoActionFilter)
    </div>
</body>
</html>

Executando o projeto iremos obter na visualização da view Index o seguinte resultado:

Vemos assim nosso fitro em ação exibindo o tempo gasto na execução desta Action.

Em um outro artigo podemos abordar a implementação de outro filtro para validar o modelo usado na aplicação.

"Porque o reino de Deus não consiste em palavras, mas em poder."
1 Coríntios 4:20

Referências:


José Carlos Macoratti