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

时间:2016-11-14 13:37:16

标签: c# asp.net-core http-status-codes

我有一个用ASP.NET Core编写的WebApi控制器,并希望返回自定义HTTP状态代码以及自定义内容。

我知道:

return new HttpStatusCode(myCode)

return Content(myContent)

我正在寻找以下内容:

return Content(myCode, myContent)

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

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

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

4 个答案:

答案 0 :(得分:6)

您可以使用ContentResult

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

答案 1 :(得分:3)

您需要使用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");  
   }  

} 

更多信息here

答案 2 :(得分:0)

我个人使用StatusCode(int code, object value)从控制器返回HTTP代码和消息/附件/其他。 现在,我假设您是在普通的普通ASP.NET Core Controller中执行此操作的,因此根据您的用例,我的答案可能是完全错误的。

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

[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版本很好地结合使用。但是,由于我们涉及的是.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很简单。 它的功能与锡罐上所说的一样,因此对您来说应该很好用;)

答案 3 :(得分:0)

我知道这是一个老问题,但是您可以使用ObjectResult对非字符串响应进行此操作。

如果您不能继承自ControllerBase

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

如果您是从ControllerBase继承的类,那么StatusCode是最简单的:

return StatusCode(myCode, myContent);