web-dev-qa-db-fra.com

Comment ajouter un en-tête personnalisé à la réponse ASP.NET Core Web API

Je porte mon API de Web API 2 à la API Web ASP.NET Core. J'avais l'habitude d'ajouter un en-tête personnalisé de la manière suivante:

  HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
  response.Headers.Add("X-Total-Count", count.ToString());
  return ResponseMessage(response);

Comment ajoute-t-on un en-tête personnalisé dans l'API Web ASP.NET Core?

36
JDawg

Vous pouvez simplement brancher le HttpContext du Http Request entrant et ajouter vos propres en-têtes personnalisés à l'objet Response avant d'appeler le retour.

Si vous souhaitez que votre en-tête persiste et soit ajouté à toutes les demandes d'API sur plusieurs contrôleurs, vous devez alors envisager de créer un composant Middleware qui le fait pour vous, puis de l'ajouter dans le pipeline de requêtes HTTP de Startup.cs

public IActionResult SendResponse()
{
    Response.Headers.Add("X-Total-Count", "20");

    return Ok();
}    
49
tmacharia

Il existe un exemple d’action simple GET qui renvoie les meilleurs enregistrements X de certaines listes ainsi que count dans l’en-tête de la réponse X-Total-Count:

using System;
using System.Linq;
using System.Net;
using Microsoft.AspNetCore.Mvc;

namespace WebApplication.Controllers
{
    [Route("api")]
    public class ValuesController : Controller
    {
        [HttpGet]
        [Route("values/{top}")]
        public IActionResult Get(int top)
        {
            // Generate dummy values
            var list = Enumerable.Range(0, DateTime.Now.Second)
                                 .Select(i => $"Value {i}")
                                 .ToList();
            list.Reverse();

            var result = new ObjectResult(list.Take(top))
            {
                StatusCode = (int)HttpStatusCode.OK
            };

            Response.Headers.Add("X-Total-Count", list.Count.ToString());

            return result;
        }
    }
}

L'URL ressemble à http://localhost:3377/api/values/5 et les résultats (pour 19 enregistrements factices générés, la valeur X-Total-Count sera donc 19) sont les suivants:

["Value 18","Value 17","Value 16","Value 15","Value 14"]
34
Dmitry Pavlov

Un attribut personnalisé peut être un bon moyen.

https://docs.Microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.2

public class AddHeaderAttribute : ResultFilterAttribute
{
    private readonly string _name;
    private readonly string _value;

    public AddHeaderAttribute(string name, string value)
    {
        _name = name;
        _value = value;
    }

    public override void OnResultExecuting(ResultExecutingContext context)
    {
        context.HttpContext.Response.Headers.Add(_name, new string[] { _value });
        base.OnResultExecuting(context);
    }
}

Puis utilisez-le comme ceci sur votre méthode API

[AddHeader("X-MyHeader", "123"]

Si vous avez un en-tête commun, vous pouvez simplement étendre cette classe:

public class MySpecialHeaderAttribute : AddHeaderAttribute
{
    public MySpecialHeaderAttribute() : base("X-MyHeader", "true")
    {
    }
}
1
Simon_Weaver