[Route("{route}")]
[HttpPost]
public async Task<System.Net.Http.HttpResponseMessage> Post([FromBody] dynamic data)
{
var test = new HttpResponseMessage(HttpStatusCode.TooManyRequests);
return test;
}
实现 ASP.NET Core Web API 控制器。目的是返回 HTTP 429。
但是,响应正文中返回了 429,但实际响应是 HTTP 200
下面邮递员的回复示例
{
"Version": "1.1",
"Content": {
"Headers": []
},
"StatusCode": 429,
"ReasonPhrase": "Too Many Requests",
"Headers": [],
"TrailingHeaders": [],
"RequestMessage": null,
"IsSuccessStatusCode": false
}
有什么想法可以解决这个问题吗?
我希望 Postman 中的响应具有 HTTP 429 状态代码。
理想情况下,我的期望是响应正文和响应标头都应包含 HTTP 429(此处,响应负载状态为 429,但响应标头包含 200)
这是因为您正在创建自己的
HttpResponseMessage
,这是完全错误的 - 这不是 ASP.NET HTTP 管道的工作方式。它不只是选择随机创建的 HTTP 消息。这就是为什么您看不到预期结果的原因。
可以通过
HttpContext.Response
引用将要返回的HTTP响应,并且您可以设置其属性StatusCode
- 这将按照您期望的那样生效。
最简单的解决方案是:
HttpContext.Response.StatusCode = (int)HttpStatusCode.TooManyRequests;
要返回附加数据,您可以直接在
HttpContext.Response
上设置 HTTP 响应的正文,但这看起来不太好。相反,您应该将端点方法的返回类型设置为 IActionResult
,然后您可以利用 ObjectResult
类,如下所示:
[HttpPost]
public async Task<IActionResult> Post([FromBody] dynamic data)
{
HttpContext.Response.StatusCode = (int)HttpStatusCode.TooManyRequests;
return new ObjectResult(new { AnyData = "any data" });
}
我希望 POSTMAN 响应在这里有一个 HTTP 429。
您可以尝试以下代码片段来指定 statusCode 和值:
return StatusCode(StatusCodes.Status429TooManyRequests, "Too Many Requests");
您可能希望使用 IActionResult 或 ActionResult(如果您使用的是 ASP.NET Core)来更直接地处理 HTTP 响应,而不是返回 HttpResponseMessage:
[Route("{route}")]
[HttpPost]
public async Task<IActionResult> Post([FromBody] dynamic data)
{
return StatusCode((int)HttpStatusCode.TooManyRequests);
}