如何从Controller返回特定的状态代码而没有内容?

Ron*_*n C 103 c# asp.net-core-mvc asp.net-core asp.net-core-webapi

我希望下面的示例控制器返回没有内容的状态代码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();   
    }
}
Run Code Online (Sandbox Code Playgroud)

Luk*_*wej 209

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

如何结束请求?

尝试其他解决方案,只需:

return StatusCode(418);
Run Code Online (Sandbox Code Playgroud)


您可以使用StatusCode(???)返回任何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


更多细节:

  • ```418没有专门的结果```严重缺少这里的功能,微软. (55认同)
  • 你可以,只需使用`Microsoft.AspNetCore.Http`命名空间中的`StatusCodes`(https://github.com/aspnet/HttpAbstractions/blob/dev/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs) . (3认同)
  • 这种方法的简单性和优点怎么强调都不为过!我需要映射 HttpResponseMessage 并从我自己的端点返回它,这是唯一真正有用的评论。 (2认同)

小智 25

最好的方法是:

return this.StatusCode(StatusCodes.Status418ImATeapot, "Error message");
Run Code Online (Sandbox Code Playgroud)

StatusCodes有各种退货状态,您可以在这里查看所有退货状态。

一旦您选择了您的StatusCode,请通过消息返回。

  • 感谢您让我意识到这个非常有用的状态代码 (3认同)

Kus*_*eth 6

对于基于 .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); 
}
Run Code Online (Sandbox Code Playgroud)


sob*_*ito 5

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

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


PAV*_*TRA 5

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();
}
Run Code Online (Sandbox Code Playgroud)


sac*_*644 5

查看当前对象结果是如何创建的。这是 BadRequestObjectResult。只是带有值和状态代码的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

客户:

if (ex is TimeoutException)
{
    return new TimeoutExceptionObjectResult("The request timed out.");
}
Run Code Online (Sandbox Code Playgroud)