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

아래 예제 컨트롤러가 내용없이 상태 코드 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();   
    }
}



답변

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

자세한 내용은:


답변

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

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


답변

현재 개체 결과가 어떻게 생성되는지 살펴보십시오. 다음은 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.");
}


답변

이를 수행하는 가장 좋은 방법은 다음과 같습니다.

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

‘StatusCodes’에는 모든 종류의 반환 상태가 있으며 https://httpstatuses.com/ 링크에서 모두 확인할 수 있습니다.

StatusCode를 선택하면 메시지와 함께 반환하십시오.


답변