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

Ответы (5)

this.HttpContext.Response.StatusCode = 418; // Я чайник

Как завершить запрос?

Попробуйте другое решение, просто:

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


Подробнее:

Этот код может работать для контроллеров MVC, отличных от .NET Core:

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

Если кто-то хочет сделать это с помощью 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();
}

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

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

StatusCodes имеет все виды статусов возврата, и вы можете увидеть их все здесь.

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

Посмотрите, как создаются текущие результаты объекта. Вот BadRequestObjectResult. Просто расширение ObjectResult со значением и StatusCode.

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

Я создал TimeoutExceptionObjectResult точно так же для 408.

/// 
/// An  that when executed will produce a Request Timeout (408) response.
/// 
[DefaultStatusCode(DefaultStatusCode)]
public class TimeoutExceptionObjectResult : ObjectResult
{
    private const int DefaultStatusCode = StatusCodes.Status408RequestTimeout;

    /// 
    /// Creates a new  instance.
    /// 
    /// Contains the errors to be returned to the client.
    public TimeoutExceptionObjectResult(object error)
        : base(error)
    {
        StatusCode = DefaultStatusCode;
    }
}

Клиент:

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

2022 WebDevInsider