asp.net core middleware vs filtros

86

Depois de ler sobre o middlware principal do asp.net, fico confuso quando devo usar filtros e quando devo usar middlewares, pois eles parecem atingir o mesmo objetivo. Quando devem ser usados ​​middlewares em vez de fitlers?

Arvand
fonte
1
Esta documentação visa essa questão específica. docs.microsoft.com/en-us/aspnet/core/mvc/controllers/…
Nkosi

Respostas:

80

Há um vídeo sobre isso no canal 9: ASP.NET Monsters # 91: Middleware vs. Filtros . Para resumir o vídeo:

A execução da solicitação começa e temos um middleware, e outro middleware, pense nisso como "bonecos russos dentro das bonecas" e, eventualmente, o middleware de roteamento é acionado e a solicitação vai para o pipline MVC. insira a descrição da imagem aqui Portanto, se você não precisa do contexto do MVC (digamos que você esteja preocupado com o fluxo e a execução, como responder aos cabeçalhos, algum mecanismo de pré-roteamento, etc.), use middlewares .
Mas se você precisa do contexto do MVC e deseja operar contra ações, use filtros .

Arvand
fonte
Então, se eu tenho uma lógica que quero executar em cada solicitação (Logging, por exemplo), apenas algumas das quais são relacionadas ao MVC, eu colocaria isso no middleware, então faria com que o manipulador de filtro fizesse qualquer lógica específica necessária para isso, então relançar para o middleware?
Terry H
64

O middleware opera no nível do ASP.NET Core e pode atuar em cada solicitação que chega ao aplicativo.

Os filtros MVC, por outro lado, só funcionam para solicitações que chegam ao MVC.

Então, por exemplo, se eu quisesse fazer com que todas as solicitações fossem feitas por HTTPS, eu teria que usar um middleware para isso. Se eu fizesse um filtro MVC que fizesse isso, os usuários ainda poderiam solicitar, por exemplo, arquivos estáticos sobre HTTP.

Mas, por outro lado, algo que registra as durações das solicitações nos controladores MVC pode ser um filtro de ação.

juunas
fonte
3

A execução de middlewareocorre antes que o contexto MVC se torne disponível no pipeline. Ou seja, middlewarenão tem acesso a ActionExecutingContextou ActionExecutedContextno caso de um ActionFilter, por exemplo. O que você tem acesso é o HttpContext, que permitirá que você execute ações na solicitação, bem como na resposta. Como a vinculação de modelo ainda não ocorreu, o uso de middleware não seria adequado para executar uma função de validação ou modificar valores. Middlewaretambém será executado em todas as solicitações, independentemente de qual controlador ou ação é chamada.

Por outro lado, filterssó será executado em ações e controladores especificados, a menos que você registre o filtro globalmente na inicialização. Como você tem acesso total ao contexto, também pode acessar o controlador e a própria ação.

Fonte e exemplo: dotnetcultist.com

Majid Parvin
fonte