Recherche…


Remarques

Le middleware est un composant logiciel qui détermine comment traiter la demande et décide de la transmettre au composant suivant du pipeline d'applications. Chaque middleware a un rôle et des actions spécifiques à exécuter sur la demande.

Utilisation du middleware ExceptionHandler pour envoyer une erreur JSON personnalisée au client

Définissez votre classe qui représentera votre erreur personnalisée.

public class ErrorDto
{
   public int Code { get; set; }
   public string Message { get; set; }

   // other fields

   public override string ToString()
   {
      return JsonConvert.SerializeObject(this);
   }
}

Ensuite, mettez le middleware ExceptionHandler suivant à la méthode Configure. Attention, la commande de middleware est importante.

app.UseExceptionHandler(errorApp =>
    {
        errorApp.Run(async context =>
        {
            context.Response.StatusCode = 500; // or another Status 
            context.Response.ContentType = "application/json";

            var error = context.Features.Get<IExceptionHandlerFeature>();
            if (error != null)
            {
                var ex = error.Error;

                await context.Response.WriteAsync(new ErrorDto()
                {
                    Code = <your custom code based on Exception Type>,
                    Message = ex.Message // or your custom message
                    
                    ... // other custom data
                }.ToString(), Encoding.UTF8);
            }
        });
    });

Middleware pour définir la réponse ContentType

L'idée est d'utiliser le rappel HttpContext.Response.OnStarting , car il s'agit du dernier événement déclenché avant l'envoi des en-têtes. Ajoutez ce qui suit à votre méthode Invoke middleware.

public async Task Invoke(HttpContext context)
{
    context.Response.OnStarting((state) =>
    {
        if (context.Response.StatusCode == (int)HttpStatusCode.OK)
        {
           if (context.Request.Path.Value.EndsWith(".map"))
           {
             context.Response.ContentType = "application/json";
           }
        }          
        return Task.FromResult(0);
    }, null);

    await nextMiddleware.Invoke(context);
}

Passer des données à travers la chaîne de middleware

De la documentation :

La collection HttpContext.Items est le meilleur emplacement pour stocker des données uniquement nécessaires lors du traitement d'une requête donnée. Son contenu est supprimé après chaque demande. Il est préférable de l'utiliser comme moyen de communication entre des composants ou des intergiciels fonctionnant à différents moments au cours d'une requête et n'ayant aucune relation directe entre eux pour transmettre des paramètres ou renvoyer des valeurs.

HttpContext.Items est une collection de dictionnaires simple de type IDictionary<object, object> . Cette collection est

  • disponible dès le début d'une HttpRequest
  • et est rejeté à la fin de chaque demande.

Vous pouvez y accéder simplement en attribuant une valeur à une entrée à clé ou en demandant la valeur d'une clé donnée.

Par exemple, certains Middleware simples pourraient ajouter quelque chose à la collection Items:

app.Use(async (context, next) =>
{
    // perform some verification
    context.Items["isVerified"] = true;
    await next.Invoke();
});

et plus tard, un autre middleware pourrait y accéder:

app.Run(async (context) =>
{
    await context.Response.WriteAsync("Verified request? " + context.Items["isVerified"]);
});

Exécuter, mapper, utiliser

Courir

Termine la chaîne. Aucune autre méthode de middleware ne fonctionnera après cela. Devrait être placé à la fin de tout pipeline.

app.Run(async context =>
{
    await context.Response.WriteAsync("Hello from " + _environment);
});

Utilisation

Effectue une action avant et après le prochain délégué.

app.Use(async (context, next) =>
{
    //action before next delegate
    await next.Invoke(); //call next middleware
    //action after called middleware
});

Illustration de son fonctionnement: entrer la description de l'image ici

MapWhen

Active le pipeline de branchement. Exécute le middleware spécifié si la condition est remplie.

private static void HandleBranch(IApplicationBuilder app)
{
    app.Run(async context =>
    {
        await context.Response.WriteAsync("Condition is fulfilled");
    });
}

public void ConfigureMapWhen(IApplicationBuilder app)
{
    app.MapWhen(context => {
        return context.Request.Query.ContainsKey("somekey");
    }, HandleBranch);
}

Carte

Similaire à MapWhen. Exécute le middleware si le chemin demandé par l'utilisateur est égal au chemin fourni en paramètre.

private static void HandleMapTest(IApplicationBuilder app)
{
    app.Run(async context =>
    {
        await context.Response.WriteAsync("Map Test Successful");
    });
}

public void ConfigureMapping(IApplicationBuilder app)
{
    app.Map("/maptest", HandleMapTest);

}

Basé sur ASP.net Core Docs



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow