Come restituire un codice di stato specifico e nessun contenuto dal controller?


119

Voglio che il controller di esempio di seguito restituisca un codice di stato 418 senza contenuto. L'impostazione del codice di stato è abbastanza semplice, ma sembra che ci sia qualcosa da fare per segnalare la fine della richiesta. In MVC prima di ASP.NET Core o in WebForms che potrebbe essere una chiamata a, Response.End()ma come funziona in ASP.NET Core dove Response.Endnon esiste?

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

Risposte:


246

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

Come terminare la richiesta?

Prova un'altra soluzione, semplicemente:

return StatusCode(418);


È possibile utilizzare StatusCode(???)per restituire qualsiasi codice di stato HTTP.


Inoltre, puoi utilizzare risultati dedicati:

Successo:

  • return Ok() ← Codice di stato Http 200
  • return Created() ← Codice di stato Http 201
  • return NoContent(); ← Codice di stato Http 204

Errore del cliente:

  • return BadRequest(); ← Codice di stato http 400
  • return Unauthorized(); ← Codice di stato http 401
  • return NotFound(); ← Codice di stato http 404


Più dettagli:


62
there is no dedicated result for 418 Grave funzionalità mancante qui, Microsoft.
Jess

1
Ho aggiornato la mia risposta come ho scoperto NoContent();che restituisce il codice di errore http 204.
Lukasz Makowej

1
Ecco un collegamento alla classe ControllerBase, che è dove vengono definiti tutti questi tipi di risultati predefiniti. docs.microsoft.com/en-us/aspnet/core/api/…
Technetium

3
Tuttavia, puoi, basta usare StatusCodesdallo Microsoft.AspNetCore.Httpspazio dei nomi ( github.com/aspnet/HttpAbstractions/blob/dev/src/… ).
Lukasz Makowej

1
sì, funzionerà, oppure puoi usareStatusCode(StatusCodes.Status412PreconditionFailed);
Lukasz Makowej

4

Questo codice potrebbe funzionare per i controller non .NET Core MVC:

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

4

Se qualcuno vuole farlo con un IHttpActionResultpotrebbe essere in un progetto API Web, potrebbe essere utile di seguito.

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

Guarda come vengono creati i risultati degli oggetti correnti. Ecco il BadRequestObjectResult. Solo un'estensione di ObjectResult con un valore e StatusCode.

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

Ho creato un TimeoutExceptionObjectResult allo stesso modo per 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.");
}

1

Il modo migliore per farlo è:

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

'StatusCodes' ha ogni tipo di stato di restituzione e puoi vederli tutti in questo link https://httpstatuses.com/

Una volta scelto il tuo StatusCode, restituiscilo con un messaggio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.