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


119

Je veux que l'exemple de contrôleur ci-dessous renvoie un code d'état 418 sans contenu. La définition du code d'état est assez simple, mais il semble qu'il y ait quelque chose à faire pour signaler la fin de la demande. Dans MVC avant ASP.NET Core ou dans WebForms qui peuvent être un appel à Response.End()mais comment cela fonctionne-t-il dans ASP.NET Core où Response.Endn'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();   
    }
}

Réponses:


246

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

Comment terminer la demande?

Essayez une autre solution, juste:

return StatusCode(418);


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


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

Succès:

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

Erreur 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:


62
there is no dedicated result for 418 Grave fonctionnalité manquante ici, Microsoft.
Jess

1
J'ai mis à jour ma réponse comme j'ai trouvé NoContent();qui renvoie le code d'erreur http 204.
Lukasz Makowej

1
Voici un lien vers la classe ControllerBase, où sont définis tous ces types de résultats prêts à l'emploi. docs.microsoft.com/en-us/aspnet/core/api/…
Technetium

3
Pourtant, vous pouvez, simplement utiliser StatusCodesdepuis l' Microsoft.AspNetCore.Httpespace de noms ( github.com/aspnet/HttpAbstractions/blob/dev/src/… ).
Lukasz Makowej

1
oui, cela fonctionnera, ou vous pouvez utiliserStatusCode(StatusCodes.Status412PreconditionFailed);
Lukasz Makowej

4

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

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

4

Si quelqu'un veut faire cela avec un IHttpActionResultpeut être dans un projet d'API Web, ci-dessous peut ê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();
}

1

Regardez comment les résultats d'objets actuels sont créés. Voici le BadRequestObjectResult. Juste une extension de l'ObjectResult avec une valeur et 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 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.");
}

1

La meilleure façon de le faire est:

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

'StatusCodes' a tous les types de statut de retour et vous pouvez tous les voir dans ce lien https://httpstatuses.com/

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.