¿Cómo devolver un código de estado específico y ningún contenido del controlador?

119

Quiero que el controlador de ejemplo a continuación devuelva un código de estado 418 sin contenido. Configurar el código de estado es bastante fácil, pero luego parece que hay algo que debe hacerse para señalar el final de la solicitud. En MVC antes de ASP.NET Core o en WebForms, eso podría ser una llamada, Response.End()pero ¿cómo funciona en ASP.NET Core donde Response.Endno 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
fuente

Respuestas:

246

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

¿Cómo finalizar la solicitud?

Prueba otra solución, solo:

return StatusCode(418);


Puede utilizar StatusCode(???)para devolver cualquier código de estado HTTP.


Además, puede utilizar resultados dedicados:

Éxito:

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

Error del cliente:

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


Más detalles:

Lukasz Makowej
fuente
62
there is no dedicated result for 418 Seria funcionalidad faltante aquí, Microsoft.
Jess
1
He actualizado mi respuesta como encontré NoContent();que devuelve el código de error http 204.
Lukasz Makowej
1
Aquí hay un enlace a la clase ControllerBase, que es donde se definen todos estos tipos de resultados listos para usar. docs.microsoft.com/en-us/aspnet/core/api/...
tecnecio
3
Aún así, puede usarlo StatusCodesdesde el Microsoft.AspNetCore.Httpespacio de nombres ( github.com/aspnet/HttpAbstractions/blob/dev/src/… ).
Lukasz Makowej
1
sí, funcionará, o puede usarStatusCode(StatusCodes.Status412PreconditionFailed);
Lukasz Makowej
4

Este código podría funcionar para controladores MVC que no son de .NET Core:

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

Si alguien quiere hacer esto con un IHttpActionResultproyecto de API web, a continuación puede 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
fuente
1

Mire cómo se crean los resultados de objetos actuales. Aquí está el BadRequestObjectResult. Solo una extensión de ObjectResult con un valor y StatusCode.

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

Creé un TimeoutExceptionObjectResult de la misma manera 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
fuente
1

La mejor forma de hacerlo es:

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

'StatusCodes' tiene todo tipo de estados de devolución y puedes verlos todos en este enlace https://httpstatuses.com/

Una vez que elija su StatusCode, devuélvalo con un mensaje.

Gabriel Arruda
fuente