Kontrolörden içerik yokken belirli bir durum kodu nasıl iade edilir?


120

Aşağıdaki örnek denetleyicinin, içeriği olmayan bir 418 durum kodu döndürmesini istiyorum. Durum kodunu ayarlamak yeterince kolaydır, ancak o zaman isteğin sonunu bildirmek için yapılması gereken bir şey var gibi görünüyor. ASP.NET Core'dan önceki MVC'de veya WebForms'ta bu bir çağrı olabilir, Response.End()ancak ASP.NET Core'un Response.Endbulunmadığı yerlerde nasıl çalışır ?

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

Yanıtlar:


247

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

Talep nasıl sonlandırılır?

Başka bir çözümü deneyin, sadece:

return StatusCode(418);


StatusCode(???)Herhangi bir HTTP durum kodunu döndürmek için kullanabilirsiniz .


Ayrıca, özel sonuçları da kullanabilirsiniz:

Başarı:

  • return Ok() ← Http durum kodu 200
  • return Created() ← Http durum kodu 201
  • return NoContent(); ← Http durum kodu 204

İstemci Hatası:

  • return BadRequest(); ← Http durum kodu 400
  • return Unauthorized(); ← Http durum kodu 401
  • return NotFound(); ← Http durum kodu 404


Daha fazla detay:


4

Bu kod, .NET olmayan Core MVC denetleyicileri için çalışabilir:

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

4

Biri bunu IHttpActionResultbir Web API projesinde olabilir ile yapmak isterse , Aşağıdakiler yardımcı olabilir.

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

Mevcut Nesne Sonuçlarının nasıl oluşturulduğuna bakın. İşte BadRequestObjectResult. Bir değer ve StatusCode içeren bir ObjectResult uzantısı.

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

Bir TimeoutExceptionObjectResult'u 408 için aynı şekilde oluşturdum.

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

Müşteri:

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

1

Bunu yapmanın en iyi yolu:

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

'StatusCodes' her türlü iade durumuna sahiptir ve hepsini bu bağlantıda görebilirsiniz https://httpstatuses.com/

Durum Kodunuzu seçtikten sonra bir mesajla iade edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.