จะส่งคืนรหัสสถานะเฉพาะและไม่มีเนื้อหาจากคอนโทรลเลอร์ได้อย่างไร?


120

ฉันต้องการให้ตัวควบคุมตัวอย่างด้านล่างส่งคืนรหัสสถานะ 418 ที่ไม่มีเนื้อหา การตั้งรหัสสถานะนั้นง่ายพอสมควร แต่ดูเหมือนว่ามีบางอย่างที่ต้องทำเพื่อส่งสัญญาณการสิ้นสุดคำขอ ใน MVC ก่อน ASP.NET Core หรือใน WebForms ที่อาจมีการเรียกใช้Response.End()แต่มันทำงานอย่างไรใน ASP.NET Core ที่Response.Endไม่มีอยู่?

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

คำตอบ:


247

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

จะลงเอยอย่างไร?

ลองใช้วิธีอื่นเพียง:

return StatusCode(418);


คุณสามารถใช้StatusCode(???)เพื่อส่งคืนรหัสสถานะ HTTP ใด ๆ


นอกจากนี้คุณสามารถใช้ผลลัพธ์เฉพาะ:

ความสำเร็จ:

  • return Ok() ←รหัสสถานะ Http 200
  • return Created() ←รหัสสถานะ Http 201
  • return NoContent(); ←รหัสสถานะ Http 204

ข้อผิดพลาดของลูกค้า:

  • return BadRequest(); ←รหัสสถานะ HTTP 400
  • return Unauthorized(); ←รหัสสถานะ HTTP 401
  • return NotFound(); ←รหัสสถานะ Http 404


รายละเอียดเพิ่มเติม:


4

รหัสนี้อาจใช้ได้กับคอนโทรลเลอร์ MVC ที่ไม่ใช่ NET Core:

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

4

หากใครต้องการทำเช่นนี้โดยIHttpActionResultอาจอยู่ในโครงการ Web API ด้านล่างนี้อาจเป็นประโยชน์

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

ดูวิธีการสร้าง Object Results ปัจจุบัน นี่คือ BadRequestObjectResult เป็นเพียงส่วนขยายของ ObjectResult ที่มีค่าและ StatusCode

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

ฉันสร้าง TimeoutExceptionObjectResult ในลักษณะเดียวกับ 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;
    }
}

ลูกค้า:

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

1

วิธีที่ดีที่สุดคือ:

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

'StatusCodes' มีสถานะการส่งคืนทุกประเภทและคุณสามารถดูทั้งหมดได้ในลิงค์นี้https://httpstatuses.com/

เมื่อคุณเลือก StatusCode ของคุณแล้วให้ส่งกลับพร้อมข้อความ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.