Bagaimana cara mengembalikan kode status tertentu dan tidak ada konten dari Controller?

119

Saya ingin contoh pengontrol di bawah ini mengembalikan kode status 418 tanpa konten. Menetapkan kode status cukup mudah tetapi kemudian sepertinya ada sesuatu yang perlu dilakukan untuk memberi tanda akhir permintaan. Di MVC sebelum ASP.NET Core atau di WebForms yang mungkin menjadi panggilan Response.End()tetapi bagaimana cara kerjanya di ASP.NET Core di mana Response.Endtidak ada?

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
sumber

Jawaban:

246

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

Bagaimana cara mengakhiri permintaan?

Coba solusi lain, cukup:

return StatusCode(418);


Anda dapat menggunakan StatusCode(???)untuk mengembalikan kode status HTTP apa pun.


Selain itu, Anda dapat menggunakan hasil khusus:

Keberhasilan:

  • return Ok() ← Kode status http 200
  • return Created() ← Kode status http 201
  • return NoContent(); ← Kode status http 204

Kesalahan Klien:

  • return BadRequest(); ← Kode status http 400
  • return Unauthorized(); ← Kode status http 401
  • return NotFound(); ← Kode status http 404


Keterangan lebih lanjut:

Lukasz Makowej
sumber
62
there is no dedicated result for 418 Fungsi serius yang hilang di sini, Microsoft.
Jess
1
Saya telah memperbarui jawaban saya karena saya menemukan NoContent();yang mengembalikan kode kesalahan http 204.
Lukasz Makowej
1
Berikut adalah link ke kelas ControllerBase, di mana semua jenis hasil out-of-the-box ini didefinisikan. docs.microsoft.com/en-us/aspnet/core/api/…
Technetium
3
Tetap saja, Anda bisa, cukup gunakan StatusCodesdari Microsoft.AspNetCore.Httpnamespace ( github.com/aspnet/HttpAbstractions/blob/dev/src/… ).
Lukasz Makowej
1
ya, ini akan berhasil, atau Anda dapat menggunakanStatusCode(StatusCodes.Status412PreconditionFailed);
Lukasz Makowej
4

Kode ini mungkin berfungsi untuk pengontrol non-.NET Core MVC:

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

Jika ada yang ingin melakukan ini dengan IHttpActionResultmungkin dalam proyek API Web, Di bawah ini mungkin bisa membantu.

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

Lihatlah bagaimana Hasil Objek saat ini dibuat. Ini adalah BadRequestObjectResult. Hanya perpanjangan dari ObjectResult dengan nilai dan StatusCode.

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

Saya membuat TimeoutExceptionObjectResult dengan cara yang sama untuk 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;
    }
}

Klien:

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

Cara terbaik untuk melakukannya adalah:

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

'StatusCodes' memiliki setiap jenis status pengembalian dan Anda dapat melihat semuanya di tautan ini https://httpstatuses.com/

Setelah Anda memilih Kode Status, kembalikan dengan pesan.

Gabriel Arruda
sumber