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にカスタムヘッダーを追加するにはどうすればよいですか?
Returnを呼び出す前に、着信Http HttpContext
からRequest
をハイジャックし、独自のカスタムヘッダーをResponse
オブジェクトに追加することができます。
カスタムヘッダーを保持し、複数のコントローラーにわたるすべてのAPI要求に追加する場合は、これを行うMiddleware
コンポーネントを作成することを検討し、StartupのHttp Request Pipelineに追加する必要があります.cs
public IActionResult SendResponse()
{
Response.Headers.Add("X-Total-Count", "20");
return Ok();
}
応答ヘッダーX-Total-Count
内のGET
だけでなく、あるリストからの上位X
レコードを返す単純な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"]
カスタム属性は良い方法です。
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")
{
}
}