如何返回自定义HTTP状态码和内容

本文关键字:状态 HTTP 自定义 何返回 返回 | 更新日期: 2023-09-27 18:17:54

我有一个用ASP编写的WebApi控制器。. NET核心,并希望返回自定义HTTP状态码与自定义内容一起。

I am aware of:

return new HttpStatusCode(myCode)

return Content(myContent)

,我正在寻找一些类似的东西:

return Content(myCode, myContent)

或一些内置机制已经做到了这一点。到目前为止,我已经找到了这个解决方案:

var contentResult = new Content(myContent);
contentResult.StatusCode = myCode;
return contentResult;

是另一种推荐的实现方法吗?

如何返回自定义HTTP状态码和内容

您可以使用ContentResult:

return new ContentResult() { Content = myContent, StatusCode = myCode };

你需要使用HttpResponseMessage

下面是示例代码
// GetEmployee action  
public HttpResponseMessage GetEmployee(int id)  
{  
   Employee emp = EmployeeContext.Employees.Where(e => e.Id == id).FirstOrDefault();  
   if (emp != null)  
   {  
      return Request.CreateResponse<Employee>(HttpStatusCode.OK, emp);  
   }  
   else  
   {  
      return Request.CreateErrorResponse(HttpStatusCode.NotFound, " Employee Not Found");  
   }  
} 

更多信息在这里

我知道这是一个老问题,但你可以通过使用ObjectResult来实现非字符串响应。

如果你不能继承ControllerBase:

return new ObjectResult(myContent)
{
    StatusCode = myCode
};

如果你是在一个类继承ControllerBase,那么StatusCode是最简单的:

return StatusCode(myCode, myContent);

我个人使用StatusCode(int code, object value)从控制器返回HTTP代码和消息/附件/其他。现在我假设你在一个普通的ASP中这样做。. NET核心控制器,所以我的答案可能是完全错误的,这取决于你的用例。

一个在我的代码中使用的快速示例(我将注释掉所有不必要的东西):

[HttpPost, Route("register")]
public async Task<IActionResult> Register([FromBody] RegisterModel model)
{
    /* Checking code */
    if (userExists is not null)
    {
        return StatusCode(409, ErrorResponse with { Message = "User already exists." });
    }
    /* Creation Code */
    if (!result.Succeeded)
    {
        return StatusCode(500, ErrorResponse with { Message = $"User creation has failed.", Details = result.Errors });
    }
    // If everything went well...
    return StatusCode(200, SuccessResponse with { Message = "User created successfuly." });
}

如果你要问,这个例子,虽然在。net 5中显示,但在以前的ASP中工作得很好。净的版本。但是既然我们是在。net 5的主题上,我想指出ErrorResponseSuccessResponse是用于标准化我的响应的记录,如下所示:

public record Response
{
    public string Status { get; init; }
    public string Message { get; init; }
    public object Details { get; init; }
}
public static class Responses 
{
    public static Response SuccessResponse  => new() { Status = "Success", Message = "Request carried out successfully." };
    public static Response ErrorResponse    => new() { Status = "Error", Message = "Something went wrong." };
}

现在,正如你说你正在使用自定义HTTP代码,使用int的代码是完美的。它做它在锡上所说的,所以这应该很适合你;)