Làm thế nào để trả về một mã trạng thái cụ thể và không có nội dung nào từ Bộ điều khiển?


119

Tôi muốn bộ điều khiển ví dụ dưới đây trả về mã trạng thái 418 không có nội dung. Đặt mã trạng thái là đủ dễ dàng nhưng sau đó có vẻ như cần phải làm gì đó để báo hiệu sự kết thúc của yêu cầu. Trong MVC trước ASP.NET Core hoặc trong WebForms có thể là một lệnh gọi đến Response.End()nhưng nó hoạt động như thế nào trong ASP.NET Core Response.Endkhông tồn tại?

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

Câu trả lời:


246

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

Làm thế nào để kết thúc yêu cầu?

Hãy thử giải pháp khác, chỉ cần:

return StatusCode(418);


Bạn có thể sử dụng StatusCode(???)để trả về bất kỳ mã trạng thái HTTP nào.


Ngoài ra, bạn có thể sử dụng các kết quả chuyên dụng:

Sự thành công:

  • return Ok() ← Mã trạng thái Http 200
  • return Created() ← Mã trạng thái Http 201
  • return NoContent(); ← Http mã trạng thái 204

Lỗi máy khách:

  • return BadRequest(); ← Mã trạng thái Http 400
  • return Unauthorized(); ← Http mã trạng thái 401
  • return NotFound(); ← Mã trạng thái Http 404


Thêm chi tiết:


62
there is no dedicated result for 418 Thiếu chức năng nghiêm trọng ở đây, Microsoft.
Jess

1
Tôi đã cập nhật câu trả lời của tôi khi tôi tìm thấy NoContent();trong đó lợi nhuận http mã lỗi 204.
Lukasz Makowej

1
Đây là một liên kết đến lớp ControllerBase, là nơi mà tất cả các loại kết quả có sẵn này được xác định. docs.microsoft.com/en-us/aspnet/core/api/…
Technetium

3
Tuy nhiên, bạn có thể, chỉ cần sử dụng StatusCodestừ Microsoft.AspNetCore.Httpkhông gian tên ( github.com/aspnet/HttpAbstaries/blob/dev/src/… ).
Lukasz Makowej

1
vâng, nó sẽ làm việc, hoặc bạn có thể sử dụngStatusCode(StatusCodes.Status412PreconditionFailed);
Lukasz Makowej

4

Mã này có thể hoạt động đối với bộ điều khiển MVC không phải .NET Core:

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

4

Nếu bất kỳ ai muốn làm điều này với IHttpActionResultcó thể nằm trong một dự án API Web, Bên dưới có thể hữu ích.

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

Xem cách các Kết quả Đối tượng hiện tại được tạo. Đây là BadRequestObjectResult. Chỉ là một phần mở rộng của ObjectResult với một giá trị và Mã trạng thái.

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

Tôi đã tạo TimeoutExceptionObjectResult theo cùng một cách cho 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;
    }
}

Khách hàng:

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

1

Cách tốt nhất để làm điều đó là:

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

'StatusCodes' có mọi loại trạng thái trả lại và bạn có thể xem tất cả chúng trong liên kết này https://httpstatuses.com/

Sau khi bạn chọn Mã trạng thái của mình, hãy gửi lại mã đó bằng một tin nhắn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.