Wie kann ich einen bestimmten Statuscode und keinen Inhalt vom Controller zurückgeben?

119

Ich möchte, dass die folgende Beispielsteuerung einen Statuscode 418 ohne Inhalt zurückgibt. Das Einstellen des Statuscodes ist einfach genug, aber dann scheint es, dass etwas getan werden muss, um das Ende der Anforderung zu signalisieren. In MVC vor ASP.NET Core oder in WebForms könnte dies ein Aufruf sein, Response.End()aber wie funktioniert es in ASP.NET Core, wo Response.Endes nicht vorhanden ist?

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.
quelle

Antworten:

246

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

Wie beende ich die Anfrage?

Versuchen Sie eine andere Lösung, nur:

return StatusCode(418);


Sie können StatusCode(???)jeden HTTP-Statuscode zurückgeben.


Sie können auch dedizierte Ergebnisse verwenden:

Erfolg:

  • return Ok() ← HTTP-Statuscode 200
  • return Created() ← HTTP-Statuscode 201
  • return NoContent(); ← HTTP-Statuscode 204

Client-Fehler:

  • return BadRequest(); ← HTTP-Statuscode 400
  • return Unauthorized(); ← HTTP-Statuscode 401
  • return NotFound(); ← HTTP-Statuscode 404


Mehr Details:

Lukasz Makowej
quelle
62
there is no dedicated result for 418 Schwerwiegende fehlende Funktionalität hier, Microsoft.
Jess
1
Ich habe meine Antwort aktualisiert, als ich fand, NoContent();dass http Fehlercode 204 zurückgibt.
Lukasz Makowej
1
Hier ist ein Link zur ControllerBase-Klasse, in der alle diese sofort einsatzbereiten Ergebnistypen definiert sind. docs.microsoft.com/en-us/aspnet/core/api/…
Technetium
3
Dennoch können Sie, verwenden Sie nur StatusCodesvon Microsoft.AspNetCore.HttpNamensraum ( github.com/aspnet/HttpAbstractions/blob/dev/src/... ).
Lukasz Makowej
1
Ja, es wird funktionieren, oder Sie können verwendenStatusCode(StatusCodes.Status412PreconditionFailed);
Lukasz Makowej
4

Wenn jemand dies mit einem IHttpActionResultmöglicherweise in einem Web-API-Projekt tun möchte, kann das Folgende hilfreich sein.

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

Dieser Code funktioniert möglicherweise für Nicht-.NET Core MVC-Controller:

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

Sehen Sie sich an, wie die aktuellen Objektergebnisse erstellt werden. Hier ist das BadRequestObjectResult. Nur eine Erweiterung des ObjectResult mit einem Wert und StatusCode.

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

Ich habe ein TimeoutExceptionObjectResult genauso für 408 erstellt.

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

Klient:

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

Der beste Weg, dies zu tun, ist:

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

'StatusCodes' hat jede Art von Rückgabestatus und Sie können alle unter diesem Link sehen https://httpstatuses.com/

Wenn Sie Ihren StatusCode ausgewählt haben, senden Sie ihn mit einer Nachricht zurück.

Gabriel Arruda
quelle