Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Índice:


       

Índice
exclude.*ndice:

Objetivo:


       Esta página tem por objetivo demonstrar como é feito o uso Middleware.

Snowden AspNetCore:


       Esta biblioteca fornecida pelo Snowden disponibiliza um meio para que aplicações desenvolvidas em "

Estado
titleAsp.Net 5
"
consigam fazer a integração facilitada. Fornecendo operações para gravar qualquer _Exception_ não tratada pelos _controllers_ e gravando também respostas selecionadas com base em seu status.

       Apesar do nome "AspNetCore"

Estado
titleAspNetCore
, ela também funciona no "
Estado
title.Net
"
a partir da versão "
Estado
title4.7.1
"
, desde que a mesma esteja utilizando a versão do "
Estado
titleAsp.Net 5
"
.

Como Funciona:


       Esta biblioteca funciona adicionando _middlewares_ na pilha de execução de sua aplicação. Então toda requisição terá uma interação com esses _middlewares_, podendo assim capturar _exceptivos_ ainda não tratados nos _controllers_ ou mesmo pegar o conteúdo da requisição ou resposta.

Configuração:


       Com uma nova aplicação em `Asp Net Core`, vamos adicionar as dependências e configurar o uso do Snowden, para isso vamos editar o arquivo de `Startup.cs` gerado.

       Na parte de configuração de serviços (`ConfigureServices`) vamos adicionar o Snowden no injetor de dependências e configura-lo. Então vamos utilizar o _namespace_ `Totvs.Snowden.ClientApi.AspNetCore` que contem extensões facilitadoras para isso. Vejamos exemplo abaixo:

Bloco de código
languagec#
public void ConfigureServices(IServiceCollection services)
{
    // Configuramos o snowden
    services.AddSnowden(config =>
    {
        // ambiente que se encontra a aplicação
        config.Environment = EnvironmentDefaultNames.Test;

        // Definições da aplicação
        config.Application.Name = "snowden-aspnetcore";
        config.Application.ProductLine = "snowden-samples";
        config.Application.Version = typeof(Startup).Assembly.GetName().Version.ToString();

        // authenticação com os servidores do snowden
        config.Credentials.Key = "tRaIsWygt2hKAubGk4EjSrGACDsa";
        config.Credentials.Secret = "7MpWYUzesrLkAgyoIze3i7rffFYa";

        // Definimos um totvsId Padrão
        // pode ser resolvido em tempo de execução implementando
        // ISnowdenAspNetCoreClientResolver e registrando. ex:
        // `config.Services.ClientResolver = typeof(MyType);`
        config.TotvsId = "03745af30a384000908D1fc02f6a5240";
                
        // Se desejamos logar qualquer exception enviada pelo sistema
        config.Log.Exceptions = true;

        // Logar as respostas com os seguintes status
        // ALERTA: Esta operação pode degradar o sistema
        // pois ela demanda utilizar stream em memoria do
        // resultado do objeto.
        config.Log.ResponseStatusCode = SnowdenClientApiAspNetCoreOptionsLog.ServerFaultStatuses;
    });

    services.AddMvc();
}

       Vemos acima que estamos configurando diversas informações do Snowden, incluindo dados da aplicação que está executando; Credenciais de autenticação com o Snowden; Cliente da operação (a seguir será mostrado como resolve-lo dinamicamente); E também onde deve ser gravado;

       Até agora tudo que fizemos foi adicionar as dependências do Snowden e configura-las. Agora vamos adicionar o Snowden na pilha de execução da aplicação. Nas configurações da aplicação ('Configure'), também utilizando do namespace "Totvs.Snowden.ClientApi.AspNetCore", vamos utilizar outro facilitador. Vejamos abaixo:

Bloco de código
languagec#
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    // O snowden é registrado antes da exception ser tratada
    // o snowden também esta pegando o ultimo estado da resposta
    app.UseSnowden();

    app.UseMvc();
}

       Com isso nossa aplicação já se encontra integrada com o Snowden, a partir de agora qualquer 'Exception" não tratada será gravada. Como configurado, também estaremos gravando qualquer resposta que pertença ao grupo de falhas de servidor (faixa 500).

       Observem também que adicionamos o Snowden logo antes do uso do MVC, isso está diretamente ligado ao funcionamento da _middlewares_  Para que ela seja capaz de capturar a _exception_  ele deve ser o primeiro na pilha de tratamento, para isso registramos ele posteriormente a qualquer tratamento de _exceptions_, assim ele é o primeiro a tratar qualquer exception lançada. Segue abaixo uma leitura sugerida para melhor entendimento:   

Identificação do Cliente em Tempo de Execução:


       Para identificarmos o cliente em tempo de execução temos que implementar a _interface_ "ISnowdenAspNetCoreClientResolver" localizada em "Totvs.Snowden.ClientApi.AspNetCore.Services", essa apenas requer a implementação de um único método que recebe o contexto da requisição e deve retornar o TotvsId.

Bloco de código
languagec#
public class CustomClientResolver : ISnowdenAspNetCoreClientResolver
{
    public string GetTotvsId(HttpContext context)
    {
        return "03745af30a384000908D1fc02f6a5240";
    }
}

       Após implementar a classe, devemos adicionar nossa implementação no container de injeção de dependências, e configurar para o Snowden utilizar nossa implementação. Para isso dentro das opções do Snowden temos a opção "Services', essa possui a propriedade "ClientResolver" que recebe o tipo que irá fazer a resolução do cliente.

Bloco de código
languagec#
public void ConfigureServices(IServiceCollection services)
{
    // Adicionamos nossa implementação de resolução de clientes no DI
    services.AddScoped(typeof(CustomClientResolver));

    // Configuramos o Snowden
    services.AddSnowden(config =>
    {
        config.Environment = EnvironmentDefaultNames.Test;
        config.Application.Name = "snowden-aspnetcore";
        config.Application.ProductLine = "snowden-samples";
        config.Application.Version = typeof(Startup).Assembly.GetName().Version.ToString();
        config.Credentials.Key = "tRaIsWygt2hKAubGk4EjSrGACDsa";
        config.Credentials.Secret = "7MpWYUzesrLkAgyoIze3i7rffFYa";

        // Resolver que irá identificar o cliente em tempo de execução
        config.Services.ClientResolver = typeof(CustomClientResolver);                
    });

    services.AddMvc();
}
Informações
iconfalse
Informações
iconfalse

Produto: Framework

Informações
iconfalse

Versão: 12.1.20

Informações
iconfalse

Processo: Uso do Middleware

Informações
iconfalse
Informações
iconfalse

Status: Finalizado

Informações
iconfalse

Data:  

Informações
iconfalse

Autores:

FERNANDO FERREIRA

GABRIEL DIAS DE OLIVEIRA

Gustavo Henrique de Matos

Karina Dos Santos Costa

Rogerio De Resende Ohashi