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?
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();
}
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"]
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")
{
}
}