web-dev-qa-db-ja.com

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にカスタムヘッダーを追加するにはどうすればよいですか?

34
JDawg

Returnを呼び出す前に、着信Http HttpContextからRequestをハイジャックし、独自のカスタムヘッダーをResponseオブジェクトに追加することができます。

カスタムヘッダーを保持し、複数のコントローラーにわたるすべてのAPI要求に追加する場合は、これを行うMiddlewareコンポーネントを作成することを検討し、StartupのHttp Request Pipelineに追加する必要があります.cs

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

    return Ok();
}    
46
machariadev

応答ヘッダー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"]
34
Dmitry Pavlov

カスタム属性は良い方法です。

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")
    {
    }
}
0
Simon_Weaver