如何返回一个特定的状态代码,没有内容从控制器?

我希望下面的示例控制器返回一个没有内容的状态代码418。设置状态代码非常简单,但是似乎需要做一些事情来发出请求结束的信号。在 ASP.NET Core 之前的 MVC 中,或者在 WebForms 中,可能是对 Response.End()的调用,但是在 Response.End不存在的 ASP.NET Core 中,它是如何工作的呢?

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();
}
}
256641 次浏览

this.HttpContext.Response.StatusCode = 418; // I'm a teapot

如何结束请求?

试试其他方法,只要:

return StatusCode(418);


你可以使用 StatusCode(???)返回任何 HTTP状态码。


此外,你还可以使用专门的搜索结果:

成功:

  • Abc 0(HTTP状态码200)
  • Abc 0(HTTP状态码201)
  • Abc 0(HTTP状态码204)

客户端错误:

  • Abc 0(HTTP状态码400)
  • Abc 0(HTTP状态码401)
  • Abc 0(HTTP状态码404)


更多细节:

这段代码可能适用于非.NET Core MVC 控制器:

this.HttpContext.Response.StatusCode = 418; // I'm a teapot
return Json(new { status = "mer" }, JsonRequestBehavior.AllowGet);

如果有人想在 Web API 项目中使用 IHttpActionResult进行此操作,以下内容可能会有所帮助。

// 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 的扩展。

Https://github.com/aspnet/Mvc/blob/master/src/microsoft . AspNetCore. Mvc. Core/ badrequestobjectresult.cs

我用同样的方法为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有各种返回状态,你可以看到他们所有的 给你

一旦您选择了您的 StatusCode,返回它与消息。

基于.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);
}