Como retornar um código de status específico e nenhum conteúdo do Controlador?

119

Quero que o controlador de exemplo abaixo retorne um código de status 418 sem conteúdo. Definir o código de status é fácil, mas parece que algo precisa ser feito para sinalizar o fim da solicitação. No MVC anterior ao ASP.NET Core ou em WebForms isso pode ser uma chamada para, Response.End()mas como funciona no ASP.NET Core onde Response.Endnão existe?

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();   
    }
}
Ron C
fonte

Respostas:

246

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

Como encerrar o pedido?

Experimente outra solução, apenas:

return StatusCode(418);


Você pode usar StatusCode(???)para retornar qualquer código de status HTTP.


Além disso, você pode usar resultados dedicados:

Sucesso:

  • return Ok() ← Código de status HTTP 200
  • return Created() ← Código de status HTTP 201
  • return NoContent(); ← Código de status HTTP 204

Erro do cliente:

  • return BadRequest(); ← Código de status Http 400
  • return Unauthorized(); ← Código de status HTTP 401
  • return NotFound(); ← Código de status HTTP 404


Mais detalhes:

Lukasz Makowej
fonte
62
there is no dedicated result for 418 Funcionalidade ausente aqui, Microsoft.
Jess
1
Atualizei minha resposta conforme descobri, NoContent();que retorna o código de erro 204 do http.
Lukasz Makowej
1
Aqui está um link para a classe ControllerBase, que é onde todos esses tipos de resultados prontos para uso são definidos. docs.microsoft.com/en-us/aspnet/core/api/…
Technetium
3
Ainda assim, você pode, basta usar StatusCodesdo Microsoft.AspNetCore.Httpnamespace ( github.com/aspnet/HttpAbstractions/blob/dev/src/… ).
Lukasz Makowej
1
sim, vai funcionar, ou você pode usarStatusCode(StatusCodes.Status412PreconditionFailed);
Lukasz Makowej
4

Este código pode funcionar para controladores não .NET Core MVC:

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

Se alguém quiser fazer isso com um IHttpActionResultpode estar em um projeto de API da Web, abaixo pode ser útil.

// 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();
}
PAVITRA
fonte
1

Observe como os resultados do objeto atual são criados. Aqui está o BadRequestObjectResult. Apenas uma extensão do ObjectResult com um valor e StatusCode.

https://github.com/aspnet/Mvc/blob/master/src/Microsoft.AspNetCore.Mvc.Core/BadRequestObjectResult.cs

Criei um TimeoutExceptionObjectResult da mesma forma para 408.

/// <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;
    }
}

Cliente:

if (ex is TimeoutException)
{
    return new TimeoutExceptionObjectResult("The request timed out.");
}
sac80644
fonte
1

A melhor maneira de fazer isso é:

return this.StatusCode(StatusCodes.Status418ImATeapot, "Error message");

'StatusCodes' tem todos os tipos de status de retorno e você pode ver todos eles neste link https://httpstatuses.com/

Depois de escolher seu StatusCode, retorne-o com uma mensagem.

Gabriel arruda
fonte