web-dev-qa-db-fra.com

Pourquoi ASP.NET Core exécute-t-il un middleware personnalisé une seule fois?

J'ai un ASP.NET Core avec le contrôleur suivant qui accepte une demande POST:

[Route("api/v1/tenants/tests")]
public class TestsController : Controller
{
    [HttpPost]       
    public IActionResult Post(string tenantId)
    {
        return Ok();
    }
}

J'ai développé un middleware "nul" pour tester les choses. Il est défini dans la méthode Configure de Startup.cs fichier:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
     if (env.IsDevelopment())
     {
         app.UseDeveloperExceptionPage();
     }

     app.UseMvc();

     app.Use(async (context, next) =>
     {
         // Forward to the next one.
         await next.Invoke();
     });
}

Question

Lorsque j'appelle le contrôleur via Postman, l'appel initial à la méthode POST passe avec succès par le middleware puis au contrôleur. Cependant, les appels suivants vont directement au contrôleur, en ignorant entièrement le middleware. Pourquoi donc?

10
Kzrystof

Les middlewares doivent être configurés avant d'appeler app.UseMvc().

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
     if (env.IsDevelopment())
     {
         app.UseDeveloperExceptionPage();
     }

     app.Use(async (context, next) =>
     {
         // Forward to the next one.
         await next.Invoke();
     });

     // !! Have to be called after setting up middleware !!
     app.UseMvc();
}

Ces informations sont présentes dans le documentation mais je ne savais pas qu'elles étaient également applicables aux middlewares personnalisés:

L'ordre dans lequel les composants middleware sont ajoutés dans la méthode Startup.Configure définit l'ordre dans lequel les composants middleware sont appelés sur les demandes et l'ordre inverse de la réponse. L'ordre est essentiel pour la sécurité, les performances et les fonctionnalités.

La méthode Startup.Configure suivante ajoute des composants middleware pour les scénarios d'application courants:

1 - Gestion des exceptions/erreurs

2 - Protocole de sécurité de transport strict HTTP

3 - Redirection HTTPS

4 - Serveur de fichiers statique

5 - Application de la politique des cookies

6 - Authentification

7 - Session

8 - MVC

Mise à jour

Dans ASP.Net Core 3.0, vous devez ajouter votre middleware avant MapControllers()

 app.UseEndpoints(endpoints =>
 {
     endpoints.MapControllers();
 });
15
Kzrystof

Startup.Configure() est exécutée une fois au démarrage de l'application. Il est utilisé pour préparer l'application, il n'est pas exécuté à chaque appel. Vous pouvez cependant l'utiliser pour configurer un middleware exécuté à chaque appel. Documentation Microsoft pour le démarrage de l'application principale asp.net contient quelques exemples à la fois Configure et ConfigureServices.

2
Dirk Trilsbeek