如何return同时自定义HTTP状态码和内容?
How to return both custom HTTP status code and content?
我有一个用 ASP.NET Core 编写的 WebApi 控制器,想要 return 自定义 HTTP 状态代码和自定义内容。
我知道:
return new HttpStatusCode(myCode)
和
return Content(myContent)
我正在寻找类似以下内容的内容:
return Content(myCode, myContent)
或一些已经这样做的内置机制。到目前为止,我已经找到了这个解决方案:
var contentResult = new Content(myContent);
contentResult.StatusCode = myCode;
return contentResult;
是实现此目标的另一种推荐方法吗?
您可以使用 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");
}
}
更多信息here
我个人使用 StatusCode(int code, object value)
到 return HTTP 代码和 Message/Attachment/else 来自控制器。
现在,我假设您是在一个普通的 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 版本。但由于我们讨论的是 .NET 5,我想指出 ErrorResponse
和 SuccessResponse
是用于标准化我的回复的记录,如下所示:
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
作为代码非常完美。
它按照罐头上说的做,所以这对你来说应该很好用 ;)
我知道这是一个老问题,但您可以使用 ObjectResult
.
对非字符串响应执行此操作
如果不能从ControllerBase
继承:
return new ObjectResult(myContent)
{
StatusCode = myCode
};
如果你在 class 继承自 ControllerBase
那么 StatusCode
是最简单的:
return StatusCode(myCode, myContent);
我有一个用 ASP.NET Core 编写的 WebApi 控制器,想要 return 自定义 HTTP 状态代码和自定义内容。
我知道:
return new HttpStatusCode(myCode)
和
return Content(myContent)
我正在寻找类似以下内容的内容:
return Content(myCode, myContent)
或一些已经这样做的内置机制。到目前为止,我已经找到了这个解决方案:
var contentResult = new Content(myContent);
contentResult.StatusCode = myCode;
return contentResult;
是实现此目标的另一种推荐方法吗?
您可以使用 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");
}
}
更多信息here
我个人使用 StatusCode(int code, object value)
到 return HTTP 代码和 Message/Attachment/else 来自控制器。
现在,我假设您是在一个普通的 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 版本。但由于我们讨论的是 .NET 5,我想指出 ErrorResponse
和 SuccessResponse
是用于标准化我的回复的记录,如下所示:
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
作为代码非常完美。
它按照罐头上说的做,所以这对你来说应该很好用 ;)
我知道这是一个老问题,但您可以使用 ObjectResult
.
如果不能从ControllerBase
继承:
return new ObjectResult(myContent)
{
StatusCode = myCode
};
如果你在 class 继承自 ControllerBase
那么 StatusCode
是最简单的:
return StatusCode(myCode, myContent);