133 votes

Comment faire pour ajouter un en-tête personnalisé pour ASP.NET Web de Base de l'API de réponse

Je suis le portage de mon API de Web API 2 à ASP.NET de Base de l'API Web. J'ai utilisé pour être en mesure 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 ajouter un en-tête personnalisé dans ASP.NET Web de Base de l'API?

165voto

machariadev Points 945

Vous pouvez juste hi-jack l' HttpContext de la Http entrantes Request et ajouter votre propre en-têtes personnalisés à l' Response objet avant l'appel de retour.

Si vous voulez que votre en-tête personnalisé à persister et être ajouté à toutes les requêtes à l'API sur plusieurs contrôleurs, vous devriez alors envisager de faire un Middleware composant qui fait cela pour vous, puis l'ajouter dans la Requête Http Pipeline en Démarrage.cs

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

    return Ok();
}    

51voto

Dmitry Pavlov Points 2260

Il est un exemple pour de simples GET action qui renvoie haut X des enregistrements de certains de la liste ainsi que l' count dans l'en-tête de 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;
        }
    }
}

URL ressemble http://localhost:3377/api/values/5 et les résultats (pour 19 factice, les dossiers produits, de sorte X-Total-Count de la valeur sera 19) du type:

["Value 18","Value 17","Value 16","Value 15","Value 14"]

24voto

Simon_Weaver Points 31141

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);
    }
}

Ensuite l'utiliser comme ceci sur votre méthode de l'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")
    {
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X