如何 return 一个特定的状态代码,但没有来自 Controller 的内容?
How to return a specific status code and no contents from Controller?
我希望下面的示例控制器 return 没有内容的状态代码 418。设置状态代码很容易,但似乎需要做一些事情来发出请求结束的信号。在 ASP.NET Core 之前的 MVC 中或在 WebForms 中可能调用 Response.End()
但它如何在 ASP.NET Core 中工作,其中 Response.End
不存在?
public class ExampleController : Controller
{
[HttpGet][Route("/example/main")]
public IActionResult Main()
{
this.HttpContext.Response.StatusCode = 418; // I'm a teapot
// How to end the request?
// I don't actually want to return a view but perhaps the next
// line is required anyway?
return View();
}
}
this.HttpContext.Response.StatusCode = 418; // I'm a teapot
How to end the request?
尝试其他解决方案,只需:
return StatusCode(418);
您可以使用 StatusCode(???)
到 return 任何 HTTP 状态代码。
此外,您可以使用专用结果:
成功:
return Ok()
← Http状态码200
return Created()
← Http状态码201
return NoContent();
← Http状态码204
客户端错误:
return BadRequest();
← Http状态码400
return Unauthorized();
← Http状态码401
return NotFound();
← Http状态码404
更多详情:
- ControllerBase Class(感谢@Technetium)
- StatusCodes.cs(ASP.NET 核心中可用的常量)
- HTTP Status Codes on Wiki
- HTTP Status Codes IANA
此代码可能适用于非 .NET Core MVC 控制器:
this.HttpContext.Response.StatusCode = 418; // I'm a teapot
return Json(new { status = "mer" }, JsonRequestBehavior.AllowGet);
如果有人想用 IHttpActionResult
执行此操作,可能在 Web API 项目中,以下内容可能会有所帮助。
// GET: api/Default/
public IHttpActionResult Get()
{
//return Ok();//200
//return StatusCode(HttpStatusCode.Accepted);//202
//return BadRequest();//400
//return InternalServerError();//500
//return Unauthorized();//401
return Ok();
}
看看当前的对象结果是如何创建的。这是 BadRequestObjectResult。只是带有值和 StatusCode 的 ObjectResult 的扩展。
我以同样的方式为 408 创建了一个 TimeoutExceptionObjectResult。
/// <summary>
/// An <see cref="ObjectResult"/> that when executed will produce a Request Timeout (408) response.
/// </summary>
[DefaultStatusCode(DefaultStatusCode)]
public class TimeoutExceptionObjectResult : ObjectResult
{
private const int DefaultStatusCode = StatusCodes.Status408RequestTimeout;
/// <summary>
/// Creates a new <see cref="TimeoutExceptionObjectResult"/> instance.
/// </summary>
/// <param name="error">Contains the errors to be returned to the client.</param>
public TimeoutExceptionObjectResult(object error)
: base(error)
{
StatusCode = DefaultStatusCode;
}
}
客户:
if (ex is TimeoutException)
{
return new TimeoutExceptionObjectResult("The request timed out.");
}
最好的方法是:
return this.StatusCode(StatusCodes.Status418ImATeapot, "Error message");
StatusCodes
有各种 return 状态,你可以看到所有 here.
一旦你选择了你的 StatusCode
,return 它会显示一条消息。
基于 .Net 5 或 .Net 6 API(也可以在 .Net Core 3x 中工作,未检查)
public async Task<ActionResult<List<DocumentsResponseDto>>> SaveDocumentDetails([FromBody] List<DocumentDetailsRequestDto> documentDetailsRequestDto)
{
var response = await _documentService.SaveDocumentDetails(documentDetailsRequestDto);
return StatusCode(Microsoft.AspNetCore.Http.StatusCodes.Status207MultiStatus, response);
}
我希望下面的示例控制器 return 没有内容的状态代码 418。设置状态代码很容易,但似乎需要做一些事情来发出请求结束的信号。在 ASP.NET Core 之前的 MVC 中或在 WebForms 中可能调用 Response.End()
但它如何在 ASP.NET Core 中工作,其中 Response.End
不存在?
public class ExampleController : Controller
{
[HttpGet][Route("/example/main")]
public IActionResult Main()
{
this.HttpContext.Response.StatusCode = 418; // I'm a teapot
// How to end the request?
// I don't actually want to return a view but perhaps the next
// line is required anyway?
return View();
}
}
this.HttpContext.Response.StatusCode = 418; // I'm a teapot
How to end the request?
尝试其他解决方案,只需:
return StatusCode(418);
您可以使用 StatusCode(???)
到 return 任何 HTTP 状态代码。
此外,您可以使用专用结果:
成功:
return Ok()
← Http状态码200return Created()
← Http状态码201return NoContent();
← Http状态码204
客户端错误:
return BadRequest();
← Http状态码400return Unauthorized();
← Http状态码401return NotFound();
← Http状态码404
更多详情:
- ControllerBase Class(感谢@Technetium)
- StatusCodes.cs(ASP.NET 核心中可用的常量)
- HTTP Status Codes on Wiki
- HTTP Status Codes IANA
此代码可能适用于非 .NET Core MVC 控制器:
this.HttpContext.Response.StatusCode = 418; // I'm a teapot
return Json(new { status = "mer" }, JsonRequestBehavior.AllowGet);
如果有人想用 IHttpActionResult
执行此操作,可能在 Web API 项目中,以下内容可能会有所帮助。
// GET: api/Default/
public IHttpActionResult Get()
{
//return Ok();//200
//return StatusCode(HttpStatusCode.Accepted);//202
//return BadRequest();//400
//return InternalServerError();//500
//return Unauthorized();//401
return Ok();
}
看看当前的对象结果是如何创建的。这是 BadRequestObjectResult。只是带有值和 StatusCode 的 ObjectResult 的扩展。
我以同样的方式为 408 创建了一个 TimeoutExceptionObjectResult。
/// <summary>
/// An <see cref="ObjectResult"/> that when executed will produce a Request Timeout (408) response.
/// </summary>
[DefaultStatusCode(DefaultStatusCode)]
public class TimeoutExceptionObjectResult : ObjectResult
{
private const int DefaultStatusCode = StatusCodes.Status408RequestTimeout;
/// <summary>
/// Creates a new <see cref="TimeoutExceptionObjectResult"/> instance.
/// </summary>
/// <param name="error">Contains the errors to be returned to the client.</param>
public TimeoutExceptionObjectResult(object error)
: base(error)
{
StatusCode = DefaultStatusCode;
}
}
客户:
if (ex is TimeoutException)
{
return new TimeoutExceptionObjectResult("The request timed out.");
}
最好的方法是:
return this.StatusCode(StatusCodes.Status418ImATeapot, "Error message");
StatusCodes
有各种 return 状态,你可以看到所有 here.
一旦你选择了你的 StatusCode
,return 它会显示一条消息。
基于 .Net 5 或 .Net 6 API(也可以在 .Net Core 3x 中工作,未检查)
public async Task<ActionResult<List<DocumentsResponseDto>>> SaveDocumentDetails([FromBody] List<DocumentDetailsRequestDto> documentDetailsRequestDto)
{
var response = await _documentService.SaveDocumentDetails(documentDetailsRequestDto);
return StatusCode(Microsoft.AspNetCore.Http.StatusCodes.Status207MultiStatus, response);
}