Как вернуть конкретный код состояния и отсутствие содержимого из контроллера?

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);
sobelito
источник
4

Если кто-то хочет сделать это с помощью a IHttpActionResultможет быть в проекте веб-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.");
}
sac80644
источник
1

Лучший способ сделать это:

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

«StatusCodes» имеет все виды статусов возврата, и вы можете увидеть их все по этой ссылке https://httpstatuses.com/

Как только вы выберете свой StatusCode, верните его с сообщением.

Габриэль Арруда
источник