Jak zwrócić określony kod statusu i brak treści z kontrolera?

120

Chcę, aby poniższy przykładowy kontroler zwracał kod stanu 418 bez zawartości. Ustawienie kodu stanu jest dość łatwe, ale wydaje się, że trzeba coś zrobić, aby zasygnalizować koniec żądania. W MVC przed ASP.NET Core lub w formularzach sieci Web, które mogą być wywołaniem, Response.End()ale jak to działa w ASP.NET Core, gdzie Response.Endnie istnieje?

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.
źródło

Odpowiedzi:

247

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

Jak zakończyć żądanie?

Wypróbuj inne rozwiązanie, po prostu:

return StatusCode(418);


Możesz użyć StatusCode(???)do zwrócenia dowolnego kodu stanu HTTP.


Możesz również użyć dedykowanych wyników:

Sukces:

  • return Ok() ← Kod statusu HTTP 200
  • return Created() ← Kod statusu HTTP 201
  • return NoContent(); ← Kod statusu HTTP 204

Błąd klienta:

  • return BadRequest(); ← Kod statusu HTTP 400
  • return Unauthorized(); ← Kod statusu HTTP 401
  • return NotFound(); ← Kod statusu HTTP 404


Więcej szczegółów:

Łukasza Makowej
źródło
4

Ten kod może działać dla kontrolerów innych niż .NET Core MVC:

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

Jeśli ktoś chce to zrobić, IHttpActionResultmoże być w projekcie interfejsu API sieci Web, poniżej może być pomocny.

// 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
źródło
1

Zobacz, jak tworzone są bieżące wyniki obiektów. Oto BadRequestObjectResult. Po prostu rozszerzenie ObjectResult z wartością i StatusCode.

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

Utworzyłem TimeoutExceptionObjectResult w taki sam sposób dla 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;
    }
}

Klient:

if (ex is TimeoutException)
{
    return new TimeoutExceptionObjectResult("The request timed out.");
}
sac80644
źródło
1

Najlepszym sposobem na to jest:

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

„StatusCodes” ma wszelkiego rodzaju statusy zwrotu i możesz je wszystkie zobaczyć w tym linku https://httpstatuses.com/

Po wybraniu StatusCode zwróć go z wiadomością.

Gabriel Arruda
źródło