ASP.Net Core 3.0 - Conhecendo a plataforma
Tags: aspnetcore, dotnetcore, webdev, middlewares
Published: 2020-08-12 13:33:14

ASP.NET Core é um framework projetado para criação de aplicações conectadas a internet. Ele tem uma estrutura modular e pode ser dividido em uma plataforma para processar requisições HTTP, uma série de frameworks para criar diferentes tipos de aplicações, e frameworks auxiliares para enriquecer a aplicação com mais funcionalidades:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/hpm894sd4u753nalntzw.png)

_Fonte: Pro ASP.NET Core 3, Develop Cloud-Ready Web Applications Using MVC, Blazor, and Razor Pages - Adam Freeman_

No ASP.Net Core os frameworks utilizados na criação das aplicações estão "separados" do resto da plataforma. Isso significa que, mesmo sendo o padrão mais utilizado, as aplicações ASP.Net Core não são obrigadas a utilizar o MVC. Podemos utilizar Razor Pages para criar websites, Blazor para criar SPA's e até mesmo desenvolver para IoT!

**Como uma aplicação ASP.Net Core funciona**

A plataforma possui diversos componentes, mas existem recursos chave que nos ajudam a entender melhor o mecanismo interno do ASP.Net Core: 

1. middlewares
2. pipeline da requisição
3. services. 

Nas aplicações conectadas as internet, uma resposta precisa ser gerada para atender uma requisição, e são estes componentes que farão boa parte do trabalho.
Middlewares

Quando uma requisição chega a aplicação, o ASP.Net Core cria um objeto que representa a requisição (context.request) e um objeto que representará sua resposta (context.response). Estes objetos são então passados a pedaços de software chamados middlewares para que sejam processados a fim de gerar a resposta desejada ao cliente.

Middlewares podem ser funções anônimas ou classes. O ASP.Net Core possui diversos middlewares nativos que nos ajudam a resolver problemas comuns no desenvolvimento de aplicações conectadas a internet, mas também podemos criar novos middlewares a fim de atendermos requisitos específicos da nossa aplicação. O mais importante para nós neste momento é entender o papel que eles possuem na plataforma. Eles realizam sua tarefa com a requisição e em seguida:

- encaminham a requisição para o próximo middleware na "cadeia de processamento";
- interrompem a cadeia antecipadamente (em caso de erros, por exemplo);

Importante: se a resposta não for gerada por nenhum middleware, o ASP.Net Core retornará por padrão uma resposta HTTP 404 para o cliente.

**O pipeline da requisição**

Falamos em "cadeia de processamento" no tópico anterior pois no ASP.Net Core os middlewares são organizados em cadeia, e ficam responsáveis por "chamar" o próximo middleware para execução. Este conjunto de middlewares recebe o nome de request pipeline:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/mnxtzhdcx60dggx20mt2.png)

Com o ASP.Net Core temos total controle na criação deste pipeline, mas devemos estar atentos a ordem em que eles são configurados. O middleware que convoca fica aguardando a resposta do middleware que foi convocado, portanto, o primeiro middleware a receber a requisição será o último a receber a resposta. Essa sequência afeta o funcionamento  da aplicação e também pode impactuar sua segurança e performance.

Agora que conhecemos o request pipeline, como seria a aplicação mais simples possível criada com ASP.Net Core?
A aplicação mais simples é a que possui apenas um middleware para responder todas as requisições da aplicação. Veja um exemplo:

```
public class Startup {   

    public void Configure(IApplicationBuilder app)    {       
        app.Run(async context => {           
            await context.Response.WriteAsync("Hello, World!");       
        });   
    }
}
```

Neste aplicação, todos os clientes receberão o texto "Hello, World!" no corpo da resposta HTTP.
Services

Nem todos os componentes da aplicação precisam fazer parte do pipeline. Também precisamos de objetos que realizem cálculos, acessem bancos de dados, processem arquivos em disco, entre outras funcionalidades. Serviços no ASP.Net Core são estas dependências que utilizamos em nossa aplicação.

Objetos interagem com outros objetos para cumprir determinada tarefas, e para dizer ao ASP.Net Core quais objetos desejamos utilizar, precisamos configurá-los como serviços em nossa aplicação. Por esta razão eles são um conceito chave nas aplicações ASP.Net Core. São eles que realizam uma parte fundamental do trabalho para que a resposta gerada corretamente para o cliente.

A utilização de serviços trazem diversos benefícios. Ela evita a repetição de código, ajuda a manter o baixo acoplamento e nos permite seguir o princípio de Inversão do Controle (SOLID). Separamos estes códigos em serviços para que possam ser reutilizados dentro da aplicação ou até mesmo em outras aplicações.

**Juntando as peças**

Juntando todos as peças podemos visualizar melhor como o ASP.Net Core trabalha para atender todas as requisições dos clientes. Toda requisição recebida pela aplicação é encaminhada ao pipeline, onde cada middleware com a ajuda ou não de um ou mais services, processa e convoca o próximo middleware  na cadeia de processamento, até que a cadeia de processamento termine e gere a resposta final para o cliente:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/8n7wxgn9t923hhivncbl.png)

Fonte: Pro ASP.NET Core 3, Develop Cloud-Ready Web Applications Using MVC, Blazor, and Razor Pages - Adam Freeman

---

_Curtiu? Siga o meu perfil para mais conteúdo sobre desenvolvimento .Net e C#. Bons estudos!_

**Referências:**

- [Pro ASP.NET Core 3, Develop Cloud-Ready Web Applications Using MVC, Blazor, and Razor Pages - Adam Freeman] (https://www.amazon.com.br/Pro-ASP-NET-Core-Cloud-Ready-Applications/dp/1484254392/ref=as_li_ss_tl?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=Pro+ASP.NET+Core+3,+Develop+Cloud-Ready+Web+Applications+Using+MVC,+Blazor,+and+Razor+Pages&qid=1597238389&sr=8-1&linkCode=ll1&tag=diogokobbi-20&linkId=ea7d8fd1897fa415d02cbd388c29a242&language=pt_BR)
- [Programming ASP.Net Core - Dino Esposito] (https://www.amazon.com.br/Programming-ASP-NET-Developer-Reference-English-ebook/dp/B07CVM27L9/ref=as_li_ss_tl?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=Programming+ASP.Net+Core+-+Dino+Esposito&qid=1597238586&sr=8-1&linkCode=ll1&tag=diogokobbi-20&linkId=405f6ea1dc58f7e5f79da70c77ab25f5&language=pt_BR)
- [ASP.Net Core in Action - Andrew Lock] (https://www.amazon.com.br/ASP-NET-Core-Action_p1-Andrew-Lock/dp/1617294616/ref=as_li_ss_tl?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=ASP.Net+Core+in+Action+-+Andrew+Lock&qid=1597238611&sr=8-1&linkCode=ll1&tag=diogokobbi-20&linkId=a44f27f1dd7c4adc6c0a8b6d4d10bbf9&language=pt_BR)