Как добавить настраиваемый заголовок в ответ 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")
{
}
}