특정 상태 코드를 반환하고 Controller에서 내용이없는 방법은 무엇입니까?


119

아래 예제 컨트롤러가 내용없이 상태 코드 418을 반환하기를 원합니다. 상태 코드를 설정하는 것은 충분히 쉽지만 요청의 끝을 알리기 위해 수행해야 할 작업이있는 것 같습니다. ASP.NET Core 이전의 MVC 또는 호출 일 수있는 WebForms Response.End()에서 Response.End존재하지 않는 ASP.NET Core에서는 어떻게 작동 합니까?

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() ← HTTP 상태 코드 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.
Jess

1
NoContent();http 오류 코드 204를 반환하는 내 답변을 업데이트했습니다 .
Lukasz Makowej

1
다음은 이러한 모든 기본 결과 유형이 정의 된 ControllerBase 클래스에 대한 링크입니다. docs.microsoft.com/en-us/aspnet/core/api/…
Technetium

3
그래도 네임 스페이스 ( github.com/aspnet/HttpAbstractions/blob/dev/src/… ) StatusCodes에서 사용할 수 있습니다 . Microsoft.AspNetCore.Http
Lukasz Makowej

1
예, 작동하거나 사용할 수 있습니다StatusCode(StatusCodes.Status412PreconditionFailed);
Lukasz

4

이 코드는 비 .NET Core MVC 컨트롤러에서 작동 할 수 있습니다.

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

4

누구든지 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입니다. 값과 StatusCode가있는 ObjectResult의 확장입니다.

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

408과 똑같은 방식으로 TimeoutExceptionObjectResult를 만들었습니다.

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