咨询区
JDawg:
我正在将 Web API 2
移植到 ASP.NET Core Web API
上,以前我都直接在 Response
属性上添加自定义的 Header,如下代码所示:
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Headers.Add("X-Total-Count", count.ToString());
return ResponseMessage(response);
请问在 ASP.NET Core Web API
上该如何往 Header 中添加呢?
回答区
Timothy Macharia:
很简单,你可以在 Action 中直接拿到 Response
属性,然后向 header 中添加你的自定义键值即可,参考如下代码:
public IActionResult SendResponse()
{
Response.Headers.Add("X-Total-Count", "20");
return Ok();
}
对了,如果你想让所有的 Response 都添加 header,可以优先考虑 中间件
,只需要在 Request Pipeline
中配置一下即可,参考代码如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.Use(async (context, next) =>
{
context.Response.Headers.Add("X-Developed-By", "Your Name");
await next.Invoke();
});
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
最后你会看到如下的 response header 中信息。
Simon_Weaver:
使用 自定义特性
也是一个非常不错的办法,参考如下代码:
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 的 Action
上,如下代码所示:
[HttpGet]
[AddHeader("X-MyHeader", "123")]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
最后的效果图如下:
点评区
不管是 request 还是 response,向 header 中配置自定义信息太常见了,比如在 request 中使用经典的 basic 验证,感觉在 ASP.NET Core Web API
中更多的是倾向于 中间件
而不是传统的 特性方式
,反正都能实现,看个人爱好吧。????????????