Как добавить настраиваемый заголовок в ответ ASP.NET Core Web API

Я переношу свой API из Web API 2 в ASP.NET Core Web API. Раньше я мог добавлять пользовательский заголовок следующим образом:

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

Как добавить пользовательский заголовок в ASP.NET Core Web API?

Ответ 1

Вы можете просто HttpContext из входящего Request Http и добавить свои собственные пользовательские заголовки в объект Response перед вызовом return.

Если вы хотите, чтобы ваш настраиваемый заголовок сохранялся и добавлялся во все запросы API на нескольких контроллерах, вам следует подумать о создании компонента Middleware который сделает это за вас, а затем добавить его в конвейер запросов Http в Startup.cs.

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

    return Ok();
}    

Ответ 2

Вот пример для простого действия GET которое возвращает верхние X записей из некоторого списка, а также count в заголовке ответа 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 выглядит следующим образом http://localhost:3377/api/values/5 а результаты (для 19 фиктивных сгенерированных записей, поэтому значение X-Total-Count будет равно 19):

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

Ответ 3

Пользовательский атрибут может быть хорошим способом.

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

Затем используйте это в своем методе API

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

Если у вас есть общий заголовок, вы можете просто расширить этот класс:

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