C# ASP.NET Core Web API 的状态代码中无法返回 Http 429

问题描述 投票:0回答:3
[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
}

enter image description here

有什么想法可以解决这个问题吗?

我希望 Postman 中的响应具有 HTTP 429 状态代码。

理想情况下,我的期望是响应正文和响应标头都应包含 HTTP 429(此处,响应负载状态为 429,但响应标头包含 200)

c# asp.net-core asp.net-core-webapi http-response-codes
3个回答
5
投票

这是因为您正在创建自己的

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" });
}

2
投票

我希望 POSTMAN 响应在这里有一个 HTTP 429。

您可以尝试以下代码片段来指定 statusCode 和值:

return StatusCode(StatusCodes.Status429TooManyRequests, "Too Many Requests");

1
投票

您可能希望使用 IActionResult 或 ActionResult(如果您使用的是 ASP.NET Core)来更直接地处理 HTTP 响应,而不是返回 HttpResponseMessage:

[Route("{route}")]
[HttpPost]
public async Task<IActionResult> Post([FromBody] dynamic data)
{
    return StatusCode((int)HttpStatusCode.TooManyRequests);
}
© www.soinside.com 2019 - 2024. All rights reserved.