Як повернути певний код статусу та відсутність вмісту з Controller?


119

Я хочу, щоб приклад контролера нижче повертав код статусу 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();   
    }
}

Відповіді:


246

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

Як закінчити запит?

Спробуйте інше рішення, просто:

return StatusCode(418);


Ви можете використовувати StatusCode(???)для повернення будь-якого коду статусу HTTP.


Також ви можете використовувати спеціальні результати:

Успіх:

  • return Ok() ← Код статусу Http 200
  • return Created() ← код статусу 201
  • return NoContent(); ← Http код статусу 204

Помилка клієнта:

  • return BadRequest(); ← Код статусу Http 400
  • return Unauthorized(); ← Код статусу Http 401
  • return NotFound(); ← Код статусу Http 404


Детальніше:


62
there is no dedicated result for 418 Тут серйозна відсутність функціоналу, Microsoft.
Джесс

1
Я оновив свою відповідь, коли виявив, NoContent();що повертає код http помилки 204.
Лукаш Маковей

1
Ось посилання на клас ControllerBase, де визначено всі ці типи результатів поза вікном. docs.microsoft.com/en-us/aspnet/core/api/…
Технецій

3
Однак ви можете просто використовувати StatusCodesз Microsoft.AspNetCore.Httpпростору імен ( github.com/aspnet/HttpAbstractions/blob/dev/src/… ).
Лукаш Маковей

1
так, це спрацює, або ви можете скористатисяStatusCode(StatusCodes.Status412PreconditionFailed);
Лукаш Маковей

4

Цей код може працювати для не-.NET Core MVC-контролерів:

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

Подивіться, як створюються поточні результати об’єктів. Ось 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/

Вибравши код коду, поверніть його з повідомленням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.