181 votes

Comment renvoyer un code d'état spécifique et aucun contenu à partir du contrôleur ?

Je veux que l'exemple de contrôleur ci-dessous renvoie un code d'état 418 sans contenu. Définir le code d'état est assez facile, mais il semble qu'il faille ensuite faire quelque chose pour signaler la fin de la requête. Dans MVC avant ASP.NET Core ou dans WebForms, cela pourrait être un appel à Response.End() mais comment cela fonctionne-t-il dans ASP.NET Core où Response.End n'existe pas ?

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

354voto

Lukasz Makowej Points 3837

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

Comment terminer la demande ?

Essayez une autre solution, juste :

return StatusCode(418);

Vous pourriez utiliser StatusCode(???) pour renvoyer n'importe quel code d'état HTTP.

Vous pouvez également utiliser des résultats dédiés :

Le succès :

  • return Ok() Code d'état Http 200
  • return Created() Code d'état Http 201
  • return NoContent(); Code d'état Http 204

Erreur du client :

  • return BadRequest(); Code d'état Http 400
  • return Unauthorized(); Code d'état Http 401
  • return NotFound(); Code d'état Http 404

Plus de détails :

1 votes

La simplicité et la vertu de cette approche ne peuvent être exagérées ! J'avais besoin de mapper un HttpResponseMessage et de le renvoyer à partir de mon propre point de terminaison et c'était le seul commentaire qui était vraiment utile.

0 votes

Désolé, dans le service SOAP d'ASP.NET Core, il n'y a pas de HttpContext.

0 votes

Mais en revenant StatusCode(418) hace le contenu du retour. Il renvoie un objet JSON contenant le code d'état et quelques autres propriétés, donc je ne vois pas en quoi cela constitue une réponse valable à la question.

16voto

Gabriel Arruda Points 63

La meilleure façon de le faire est :

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

StatusCodes a tous les types d'états de retour et vous pouvez les voir tous. aquí .

Une fois que vous avez choisi votre StatusCode rendez-le avec un message.

8voto

sac80644 Points 73

Examinez la façon dont les résultats des objets actuels sont créés. Voici le BadRequestObjectResult. Juste une extension de l'ObjectResult avec une valeur et un StatusCode.

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

J'ai créé un TimeoutExceptionObjectResult de la même manière pour la 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;
    }
}

Client :

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

5voto

PAVITRA Points 75

Si quelqu'un veut faire cela avec un IHttpActionResult peut être dans un projet d'API Web, Below pourrait être utile.

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

5voto

sobelito Points 135

Ce code peut fonctionner pour les contrôleurs MVC non-.NET Core :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X